欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

交叉验证

程序员文章站 2022-03-29 08:07:24
...

在sklearn中将训练/测试数据集分离

from sklearn import datasets

iris = datasets.load_iris()
features = iris.data
labels = iris.target

from sklearn.model_selection import train_test_split
features_train, features_test, labels_train, labels_test = train_test_split(
            iris.data, iris.target, test_size=0.4, random_state=0)

# 设置 random_state 参数为 42(random_state 控制哪些点进入训练集,哪些点用于测试;
# 将其设置为 42 意味着我们确切地知道哪些事件在哪个集中; 并且可以检查你得到的结果)

数据处理转换并用于机器学习的流程

交叉验证

交叉验证(cross validation)

交叉验证

如图所示,k-folder交叉验证就是用全部数据划分为k个子集,然后取一个子集作为测试集,剩下k-1个子集作为训练集。最后把这k次测试的精确度取一个平均值。

k折交叉验证编码

from sklearn.cross_validation import KFold
# KFold接受两个参数,一个是数据总集中项目数量,另一个是参数是想查看多少折
# KFold提供两个列表,
kf = KFold(len(authors), 2)

#第一个列表是要在训练集中使用的所有数据点索引值的集合
#第二个列表是要在测试集中使用的所有数据点索引值的集合
# 然后我们可以根据这些索引引入特征和标签,并将特征和标签进行分配
for train_indices, test_indices in kf:
    feature_train = [word_data[ii] for ii in train_indices]
    feature_test = [word_data[ii] for ii in test_indices]
    authors_train = [authors[ii] for ii in train_indices]
    authors_test = [authors[ii] for ii in test_indices]

但我们要注意的是k折交叉验证算法内部划分之前不会进行乱序排序,因此如果如果你的数据本身是有顺序的,可能进行泾渭分明的划分,这对于训练和测试的效果都不好

sklearn中的GridSearchCV

注: 此主题内容引用自优达学城

GridSearchCV 用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。它的好处是,只需增加几行代码,就能遍历多种组合。

from sklearn.model_selection import GridSearchCV
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svr = svm.SVC()
clf = GridSearchCV(svr, parameters)
clf.fit(iris.data, iris.target)

让我们逐行进行说明。

parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}

参数字典以及他们可取的值。在这种情况下,他们在尝试找到 kernel(可能的选择为 ‘linear’ 和 ‘rbf’ )和 C(可能的选择为1和10)的最佳组合。

这时,会自动生成一个不同(kernel、C)参数值组成的“网格”:

标题一 标题二
(‘rbf’, 1) (‘rbf’, 10)
(‘linear’, 1) (‘linear’, 10)

各组合均用于训练 SVM,并使用交叉验证对表现进行评估。

svr = svm.SVC() 

这与创建分类器有点类似,就如我们从第一节课一直在做的一样。但是请注意,“clf” 到下一行才会生成—这儿仅仅是在说采用哪种算法。另一种思考方法是,“分类器”在这种情况下不仅仅是一个算法,而是算法加参数值。请注意,这里不需对 kernel 或 C 做各种尝试;下一行才处理这个问题。

clf = grid_search.GridSearchCV(svr, parameters) 

这是第一个不可思议之处,分类器创建好了。 我们传达算法 (svr) 和参数 (parameters) 字典来尝试,它生成一个网格的参数组合进行尝试。

clf.fit(iris.data, iris.target) 

第二个不可思议之处。 拟合函数现在尝试了所有的参数组合,并返回一个合适的分类器,自动调整至最佳参数组合。现在您便可通过 clf.best_params_ 来获得参数值。

实际举例如下:

param_grid = {
         'C': [1e3, 5e3, 1e4, 5e4, 1e5],
          'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1],
          }
# for sklearn version 0.16 or prior, the class_weight parameter value is 'auto'
clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
clf = clf.fit(X_train_pca, y_train)
相关标签: 数据 数据处理