【笔记】初探KNN算法(3)

KNN算法(3)

测试算法的目的就是为了帮助我们选择一个更好的模型

训练数据集,测试数据集方面

一般来说,我们训练得到的模型直接在真实的环境中使用
这就导致了一些问题
如果模型很差,未经改进就应用在现实环境下,那这样得到的预测结果必然是不好的,而且在真实环境中,是难以拿到真实的label(输出结果)的

因此,很明显,训练和测试同步进行是不恰当的,应该进行训练和测试数据分离,通过测试数据直接判断模型的好坏,在模型进入真实的环境中改进模型,不断的优化改进模型

先前的计算是将全部的X都当做了测试数据集

我们不能直接对其取前多少数据
因为在类别数组中,是已经排好序的数组,如果按照前多少多少来切,出来的肯定是不对的

因此我们只需要将其打乱顺序,再进行前多少多少的切片就可以了,但是由于X和y是分离的情况,是不可以分别对X和y进行随机化的,但是我们可以对索引进行乱序处理从而实现随机化
shuffle_indexes = np.random.permutation(len(X))

然后我们指定一下测试数据集的比例,设百分之20是测试数据集,因为有可能得到浮点数,因此有int来强制转换成整形
teat_ratio = 0.2
teat_size = int(len(X) * teat_ratio)

设前20%是测试数据集,后80%是训练数据集,当然,这是可以更改的

这样我们就完成了对训练数据集和测试数据集的分离

我们可以将其写入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

我们可以尝试使用使用自己的算法

对于求解预测准确率
只要将预测和测试进行比较,得出相同的数据个数,然后除以测试数据即可

sklearn中的train_test_split
train_test_split(X,y,test_size=0.2)
注意的是,不写test_size的话,默认值为0.2

如果我们想复现之前进行的拆分,那么我们就要传入一个随机的种子random_state
train_test_split(X,y,test_size=0.2,random_state=666)

posted @ 2021-01-13 21:44  DbWong_0918  阅读(129)  评论(0编辑  收藏  举报