机器学习--KNN算法中的训练数据与测试数据的分离

为什么要将数据分成两部分?

假如直接通过大量的训练数据得到我们想要的模型,并且将这个模型直接放在真实环境中使用。但是这样做就会产生很多问题。

1,模型的性能很差。2,在真实的环境中可能很难拿到数据的真实的label,比如银行客户的信誉,是需要大量的数据才能得到的。

其实在实际环境中,我们是用已经做好的模型去预测真实的数据,这个模型的性能是需要提前经过大量的数据去测试它的性能是怎么样的。那么如何测试这个模型的性能呢?

改进方法如下:

机器学习--KNN算法中的训练数据与测试数据的分离

 

将大量的数据按照比列分成训练数据和测试数据,再用得到的模型对测试数据进行预测并且得到一组预测数据,最后将测试数据与预测数据进行对比,得到的正确率就是这个模型的性能表现了。为什么拿测试数据进行对比,因为测试数据的label都是真实的,这样做有利用得到跟真事的数据。

封装函数如下:

# 将数据X和标签y按照test_ratio分割成X_train和X_test,y_train,y_test
def train_test_split(X,y,test_ratio = 0.2,seed = None):
    """检查数据和标签是否匹配,检查比列数是否合法"""
    assert X.shape[0] == y.shape[0]
    assert 0 <= test_ratio <= 1

    #  种下随机种子
    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,y_train,X_test,y_test