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)