python的“大份练小份试”

既然咱们想给模型搭个准确的舞台,那先得明白一个道理:想让机器学会判断新倒的红酒是什么味儿,或者算出股市该涨还是跌,可千万别把所有历史数据一股脑儿塞进去。要是这么干,最后得出的结果准保是一串没谱的数字。所以咱们得把数据拆开练,就像平时给自己煲汤一样,先把一大部分拿去炖久一点,剩下的留着当汤头检验味道咋样。这种“大份练小份试”的分法,就是咱们常说的训练集和测试集。 虽说用 sklearn 的那个 train_test_split 写两行代码就能搞定,但这就好比看着别人做好了饭自己却不知道怎么做的。要是想知根知底,咱们就得来个自己动手的过程。 第一步得先洗牌。别觉得标签是0、1、2排着队的就省事,这么切肯定会让模型看出顺序的痕迹。得用 numpy 的 permutation 来把索引打乱,让 X 和 y 一起洗个澡。 第二步是按比例切蛋糕。假设咱们留30%的数据做测试,也就是让那部分占比是0.3。得注意 Python 切片是左闭右开的规律,算出小数点后几位后得向上取整。比如说算出来有54个数进测试集,剩下的 0.4 就都归训练集了。 最后一步是固定个种子。为了让大家不管跑几次代码结果都一样方便对比,给 random.seed 一个固定的值就行。 把这三步写成函数就是这样的: def train_test_split(X, y, test_ratio=0.3, seed=None): 这里面先检查一下 X 和 y 的行数得对上。如果有 seed 就设个随机起点。然后用 shuffle_index 打乱索引顺序。算出测试集的大小用 ceil 向上取整。接着把前面的那些索引给测试集用,后面的留给训练集。最后按照这两组索引去切分 X 和 y 就完事了。 虽然自己写的代码比 sklearn 要多几行代码量,但是理解起来就通透多了。 接下来还能把这函数打包成库方便调用。把代码存成 model_selection.py,再新建个 __init__.py 放到文件夹里,这就成了个 Python 包。在 notebook 里导进来的时候得记得给 PYTHONPATH 加点东西或者用 sys.path.append('.') 来告诉 Python 去这里找包。 用法其实跟 sklearn 的完全一样: X_train, X_test, y_train, y_test = train_test_split(X, y, test_ratio=0.25) 这样就能自定义25%的测试集比例了。 现在数据集已经按训练和测试分好两队了。下一步就是把特征矩阵喂给 kNN 模型算个预测值 y_pred,再跟真实的 y_test 对比一下准确率、召回率这些指标。到底模型行不行这就测出来了。