随便写写【梳理思路】
一、交叉验证:
比如kfold=10:进行了十次训练,得到十个模型,该选取哪一个为最终模型??比如groupkfold=10:十次不一样的训练集和测试集划分,得到十个不同的参数,也就是十个不同的模型,最后该如何选取???
1、先看个简单的例子,学习交叉验证:
参考:(6条消息) 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子_JasonDing1354的博客-CSDN博客
from sklearn.cross_validation import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print scores
[ 1. 0.93333333 1. 1. 0.86666667 0.93333333 0.93333333 1. 1. 1.]
对十次迭代计算平均的测试准确率
print scores.mean() 0.96666666666
随便写写:
cv=10 意味着数据被分成了10份,每一份都被当作过训练集、测试集,进行了10次模型训练---得到10个不同的模型--也得到10个不同的分数--求了10次的均值
不理解之处:
既然是10个不同的模型、10个不同的分数,为什么要求10次均值,求均值的意义是什么?
解决:【以下是从网上、书上学习到的一些关于交叉验证的知识】
:):):):)
(1)不同的训练集、测试集分割的方法导致其准确率不同,而交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,最后对结果进行平均处理。这样来有效降低测试准确率的差异。
(2)交叉验证是一种用于估计机器学习模型性能的统计方法。它是一种评估统计分析结果如何推广到独立数据集的方法。简单来说,就是将数据集分成不同的部分,然后某些部分训练,某些部分测试,某些部分验证,这样可以最大程度避免过拟合以及测试模型在陌生数据集的性能。
(3)十折交叉验证:10-fold cross validation 英文名叫做10-foldcross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十分,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。
通过一些交叉验证原理的学习慢慢有了一个思维:
交叉验证并不是为了去获取一个模型,而是为了去评估这个模型的一些特性【对整体数据的一个预测评估,估计模型的性能】,所以取了一个均值。
最后保存的能够被使用的模型,并不是交叉验证所选出来的这个模型,而是交叉验证的模型,去全部数据集上面进行一个训练,得到一个模型,进行保存!!
【也就是从交叉验证结果中找到评估分数最高的那组模型,确定最终模型的超参。然后再使用最终确定的超参和完整的数据集(此时数据集不再进行切分,全部纳入模型训练),训练出一个最终的模型。】
【取平均值作为某个模型的性能指标,根据性能指标来挑选出最优模型,重新进行训练,获得最终模型】
关于交叉验证的其他学习:
交叉验证一方面可以用于调整超参数,也即是通过反复的交叉训练,找到模型最优的超参数,比如使用网格搜索GridSearchCV()。另一方面用于评估模型在数据集上的表现,比如cross_val_score()。
不涉及调参时【用于模型评估时】:
交叉验证用scores = cross_val_score(model, X_train, y_train, cv = n_folds, scoring = 'r2')
涉及调参时【选择参数】:
model_xgb = xgb.XGBRegressor(objective ='reg:squarederror')
parameters = {'loss':['ls','lad','huber','quantile'],
'learning_rate':[0.1,0.07], #(0,1]之间的超参数
'n_estimators':[100,150],
'max_depth':[2,3,4], #设置树的深度
'min_samples_split': [2, 3, 4],
'min_samples_leaf':[1,2,3,4]}
model_gs = GridSearchCV(model_gbr, parameters,cv=5)
model_gs.fit(X,y)
print('GBR Best score is:',model_gs.best_score_)
print('GBR Best parameter is:',model_gs.best_params_)
交叉验证的作用:
参考:(6条消息) 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子_JasonDing1354的博客-CSDN博客
(1)进行调参,最终得到一组最佳的模型参数。得到一组最佳的参数使得测试数据的准确率和泛化能力最佳。
代码见参考
(2)模型选择
交叉验证也可以帮助我们进行模型选择,以下是一组例子,分别使用iris数据,KNN和logistic回归模型进行模型的比较和选择。
# 10-fold cross-validation with the best KNN model
knn = KNeighborsClassifier(n_neighbors=20)
print cross_val_score(knn, X, y, cv=10, scoring='accuracy').mean()
0.98
# 10-fold cross-validation with logistic regression
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
print cross_val_score(logreg, X, y, cv=10, scoring='accuracy').mean()
0.953333333333
根据score选择logistic regression模型
(3)特征选择
通过交叉验证来进行特征的选择,对比不同的特征组合对于模型的预测效果。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 获得数据
data = pd.read_csv('http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv', index_col=0)
# 创建特征名字的列表create a Python list of three feature names
feature_cols = ['TV', 'Radio', 'Newspaper']
# 提取出data中对应于特征名字的数据为dataframe形式use the list to select a subset of the DataFrame (X)
X = data[feature_cols]
# 选择对应的yselect the Sales column as the response (y)
y = data.Sales
# 进行10折交叉验证10-fold cv with all features
lm = LinearRegression()
scores = cross_val_score(lm, X, y, cv=10, scoring='mean_squared_error')
print scores
[-3.56038438 -3.29767522 -2.08943356 -2.82474283 -1.3027754 -1.74163618
-8.17338214 -2.11409746 -3.04273109 -2.45281793]
这里要注意的是,上面的scores都是负数,为什么均方误差会出现负数的情况呢?因为这里的mean_squared_error是一种损失函数,优化的目标的使其最小化,而分类准确率是一种奖励函数,优化的目标是使其最大化。
# fix the sign of MSE scores
mse_scores = -scores
print mse_scores
[ 3.56038438 3.29767522 2.08943356 2.82474283 1.3027754 1.74163618
8.17338214 2.11409746 3.04273109 2.45281793]
# convert from MSE to RMSE
rmse_scores = np.sqrt(mse_scores)
print rmse_scores
[ 1.88689808 1.81595022 1.44548731 1.68069713 1.14139187 1.31971064
2.85891276 1.45399362 1.7443426 1.56614748]
# calculate the average RMSE
print rmse_scores.mean()
1.69135317081
选择其中两个特征名字进行验证:
# 10-fold cross-validation with two features (excluding Newspaper)
feature_cols = ['TV', 'Radio']
X = data[feature_cols]
print np.sqrt(-cross_val_score(lm, X, y, cv=10, scoring='mean_squared_error')).mean()
1.67967484191
根据结果对比某个特征对于模型性能的好坏!!!
——————————————————————:)
之后遇到别的再补充!!
随便写写over:):)