knn算法划分数据集(四)

举报
咔吧咔吧 发表于 2020/10/29 14:51:57 2020/10/29
【摘要】 划分数据集 存在问题 目前我们训练数据的过程如下: 如下图所示,我们将所有的数据都作为训练数据,训练出一个模型,每当得到一个新的数据,则计算新数据到训练数据的距离,预测得到新数据的类别。 举例:银行发放信用卡,银行要想得到客户的信用等级,需要跟踪用户两三年时间来收集用户信息,才能得到,如果我们将两三年的数据全部作为训练集,当新客户来临时,我们又...

    划分数据集

    存在问题

    目前我们训练数据的过程如下:

    如下图所示,我们将所有的数据都作为训练数据,训练出一个模型,每当得到一个新的数据,则计算新数据到训练数据的距离,预测得到新数据的类别。

    

        举例:银行发放信用卡,银行要想得到客户的信用等级,需要跟踪用户两三年时间来收集用户信息,才能得到,如果我们将两三年的数据全部作为训练集,当新客户来临时,我们又需要等待两三年,才能知道新用户的真实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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。