sklearn.model_selection就是选择模型的额,主要方法是cross_val_score,主要是把原始数据拿出一部分来做验证,看训练的怎么样,就像考试一样,考题和平时的练习题不一样才能知道学的怎么样,假如用训练数据做test,出现的问题就是过拟合,很好理解,就是练习题(training data 得分很高)做的非常熟练,一考试(test data 得分很低)就蒙圈。
from sklearn.model_selection import cross_val_score
scores = cross_val_score( clf, iris.data, iris.target, cv=5, scoring='f1_macro')
这里scoring是验证方法,一般分类都选用accuracy。
f1_macro,‘f1_micro’ 这两个都是针对数据非常不平等,有一个labe很少出现,比如癌症,你用accuracy来评价不科学,因为出现癌症本身的概率太小,就要用这两个指标来衡量假阳性和假阴性。
cv是k折一般,就是分成几份,k-1份训练,1分test。默认用kfold,数据是连续的。
另:吴恩达这样建议,training set,cross_validation set跟test set比例为6:2:2,即留出20%的数据专门用于test。
这可以用train_test_split来实现。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
random_state是随机种子,这叫 伪随机,因为相同的随机种子会划分同样的数据集。
还有一种替代kfold,sklearn.model_selection.ShuffleSplit,先打乱数据,再分,比如股市受大盘影响比较大,用kfold来分,可以training set是震荡市,test set是下跌市,就不准。
文档这样形容[ShuffleSplit
可以替代 KFold
交叉验证,因为其提供了细致的训练 / 测试划分的 数量和样例所占的比例等的控制。
]
from sklearn.model_selection import ShuffleSplit
ss = ShuffleSplit(n_splits=3,test_size=0.25,random_state=0)
scores = cross_val_score( clf, iris.data, iris.target, cv=ss, scoring='f1_macro')