初学阶段,当开始接触,这里记录一些自己的理解,如有不对的地欢迎各位大佬批评指正~~
k交叉验证可以用于模型好坏的评估,也可用于调参,使模型达到最优。 KFold(n_splits=’warn’, shuffle=False, random_state=None)
n_splits 表示划分为几块(至少是2)
shuffle 表示是否打乱划分,默认False,即不打乱
random_state 表示是否固定随机起点,当设置shuffle == True时使用,否则会有警告.
KFold有两个方法: 1,get_n_splits([X, y, groups]) 返回分的块数 2,split(X[,Y,groups]) 返回分类后数据集的index
1.将样本分为k个样本子集 2.依次遍历k个子集,把当前子集作为验证集,其余的作为训练集 3.取结果的平均值作为最终的评价指标
前辈地址
把样本划分为k份,每次取K份中的一份(这一份也就是循环到第几次的那份)作为验证集,其余的数据作为测试集,下一次取当前验证集的下一份作为验证集,其余的作为测试集。直到循环k次,结束。将所有结果的平均值作为最后的结果。
如现在的测试集中共四个样本,在设置shuffle为False情况下,如果我们设定k为2,则会把样本划分为两份,每份中有2个样本。那么按照k折交叉的原理,首先取第一份中的数据作验证集,即索引为0,1的两个样本点为验证集,索引为2,3的作为测试集。k为2就要循环两次,下一次取下边的一组,这里就是索引为2,3的作验证集,前两个样本变为测试集,循环结束。
k增多的情况,以此类推。如果设置shuffle为true,则会打乱测试,索引不会按顺序来,但是原理应该是一样滴~
1.充分的利用数据,可以从有限的数据中获取到尽可能多的信息 2.可以在一定程度上减少过拟合现象
导入相应的类库
from sklearn.linear_model import LinearRegression from sklearn.linear_model import Lasso from sklearn.linear_model import ElasticNet from sklearn.tree import DecisionTreeRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.svm import SVR from sklearn.model_selection import train_test_split from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from pandas import read_csv from pandas import set_option from pandas.plotting import scatter_matrix from matplotlib import pyplot读入文件
filename='housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV'] data=read_csv(filename,names=names,delim_whitespace=True)分离样本集和测试集
value=data.values X=value[:,0:13] Y=value[:,13] test_validation=0.2 random_seed=7 X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=test_validation,random_state=random_seed)测试各个算法在测试集上的准确度,这里都使用默认参数,为以后的模型选择与调整提供基准。 评价的标准是均方误差。
models={} models['LR']=LinearRegression() models['LASSO']=Lasso() models['EN']=ElasticNet() models['DTR']=DecisionTreeRegressor() models['KNN']=KNeighborsRegressor() models['SVM']=SVR() scoring='neg_mean_squared_error' num_splits=10 result=[] for key in models: kfold = KFold(n_splits=num_splits) results=cross_val_score(models[key],X_train,Y_train,cv=kfold,scoring=scoring) result.append(results) print(results.mean(),results.std())结果: -21.379855726678684 9.414263656984774 -26.42356110840965 11.651109915777916 -27.5022593506617 12.305022264112704 -23.285648780487804 10.230541675382081 -41.89648839024391 13.901688149849864 -67.8278859731828 29.049137595262604
这里使用了cross_val_score方法进行交叉验证,其定义为: sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)
estimator: 需要使用交叉验证的算法 X: 输入样本数据 y: 样本标签 groups: 将数据集分割为训练/测试集时使用的样本的组标签(一般用不到) scoring: 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果。 具体可用的评价指标 官网
cv: 交叉验证折数或可迭代的次数 n_jobs: 同时工作的cpu个数(-1代表全部) verbose: 详细程度 fit_params: 传递给估计器的拟合方法的参数 error_score: 如果在估计器拟合中发生错误,要分配给该分数的值(一般不需要指定)
参考文章