knn算法划分数据集(四)
【摘要】 划分数据集 存在问题 目前我们训练数据的过程如下: 如下图所示,我们将所有的数据都作为训练数据,训练出一个模型,每当得到一个新的数据,则计算新数据到训练数据的距离,预测得到新数据的类别。 举例:银行发放信用卡,银行要想得到客户的信用等级,需要跟踪用户两三年时间来收集用户信息,才能得到,如果我们将两三年的数据全部作为训练集,当新客户来临时,我们又...
划分数据集
存在问题
目前我们训练数据的过程如下:
如下图所示,我们将所有的数据都作为训练数据,训练出一个模型,每当得到一个新的数据,则计算新数据到训练数据的距离,预测得到新数据的类别。
举例:银行发放信用卡,银行要想得到客户的信用等级,需要跟踪用户两三年时间来收集用户信息,才能得到,如果我们将两三年的数据全部作为训练集,当新客户来临时,我们又需要等待两三年,才能知道新用户的真实label,所以在短期内很难根据真实label判断模型好坏,进而无法改进模型。
结论:将所有数据集全部用于训练,这种做法是不可取的。
改进:
如下图:将数据中的70%-80%作为训练数据,将剩余的作为测试数据,训练数据用于训练模型,测试数据用于判断模型好坏
上述将数据集进行切分的方式,就是sklearn中的train_test_split
代码:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets #获取sklearn中的内置数据集 iris = datasets.load_iris() #获取特征值和目标值 X = iris.data y = iris.target #将长度X对应的索引值进行随机排列 shuffle_indexes = np.random.permutation(len(X)) #定义测试机的比例 test_ratio = 0.2 #得到测试集对应的数据量 test_size = int(len(X) * test_ratio) #获取测试集的索引和训练集的索引 test_indexes = shuffle_indexes[:test_size] train_indexes = shuffle_indexes[test_size:] #获取训练数据集 X_train = X[train_indexes] y_train = y[train_indexes] #获取测试数据集 X_test = X[test_indexes] y_test = y[test_indexes]
整合为代码model_selection.py:
import numpy as np def train_test_split(X, y, test_ratio=0.2, seed=None): """将数据 X 和 y 按照test_ratio分割成X_train, X_test, y_train, y_test""" assert X.shape[0] == y.shape[0], \ "the size of X must be equal to the size of y" assert 0.0 <= test_ratio <= 1.0, \ "test_ration must be valid" if seed: np.random.seed(seed) shuffled_indexes = np.random.permutation(len(X)) test_size = int(len(X) * test_ratio) test_indexes = shuffled_indexes[:test_size] train_indexes = shuffled_indexes[test_size:] X_train = X[train_indexes] y_train = y[train_indexes] X_test = X[test_indexes] y_test = y[test_indexes] return X_train, X_test, y_train, y_test
放入_init_.py文件到knn目录下,使其变为工程目录,以便于后面能够直接导入train_test_split方法
测试封装的代码:
from knn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y) from knn.kNN import KNNClassifier knn_clf = KNNClassifier(k=6) knn_clf.fit(X_train,y_train) y_predict = knn_clf.predict(X_test)
准确率计算:
(sum([1 if y_predict[i] == y_test[i] else 0 for i in range(len(y_test))]))/len(y_test)
sklearn中的train_test_split
代码:
from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)