使用 sklearn 使用 k 折叠预测测试数据的类别
Posted
技术标签:
【中文标题】使用 sklearn 使用 k 折叠预测测试数据的类别【英文标题】:predict classes of test data using k folding using sklearn 【发布时间】:2015-09-14 09:17:35 【问题描述】:我正在从事一个数据挖掘项目,我正在使用 python 中的 sklearn 包对我的数据进行分类。
为了训练我的数据并评估预测值的质量,我正在使用 sklearn.cross_validation.cross_val_predict 函数。
但是,当我尝试在测试数据上运行我的模型时,它会要求提供不可用的基类。
我已经看到(可能的)使用 sklearn.grid_search.GridSearchCV 函数的变通方法,但我不愿意将这种方法用于一组固定的参数。
通过 sklearn.cross_validation 文档,我遇到了 cross_val_score 函数。由于我对分类问题的世界还很陌生,所以我不太确定这是否可以解决我的问题。
任何帮助都会很棒!
谢谢!
编辑:
你好!我的印象是我对原始查询相当模糊。我将尝试详细说明我到底在做什么。如下:
我生成了 3 个 numpy.ndarrays X、X_test 和 y,nrows = 10158、22513 和 10158 分别对应于我的训练数据、测试数据和训练数据的类标签。
之后,我运行以下代码:
from sklearn.svm import SVC
from sklearn.cross_validation import cross_val_predict
clf = SVC()
testPred = cross_val_predict(clf,X,y,cv=2)
这很好用,然后我可以使用教程中提到的 stemPred 和 y。
但是,我希望预测 X_test 的类别。错误消息是不言自明的,它说:
ValueError: Found arrays with inconsistent numbers of samples: [10158 22513]
我正在使用的当前解决方法(我不知道这是一种解决方法还是唯一的解决方法)是:
from sklearn import grid_search
# thereafter I create the parameter grid (grid) and appropriate scoring function (scorer)
model = grid_search.GridSearchCV(estimator = clf, param_grid = grid, scoring = scorer, refit = True, cv = 2, n_jobs = -1)
model.fit(X,y)
model.best_estimator_.fit(X,y)
testPred = model.best_estimator_.predict(X_test)
这种技术暂时可以正常工作;但是,如果我不必使用 GridSearchCV 功能,我就能睡得更好。
【问题讨论】:
“基类不可用”是什么意思?您可以发布您看到的错误消息吗?您的 y 标签中有多少类?我可以编写一个示例代码来演示如何使用 sklearn 来训练和测试分类问题。 @JianxunLi 你好!谢谢你的提议!我已经编辑了我的原始帖子,以使我的问题更清楚。此外,我正在处理 4 个班级。再次感谢! 啊,好多了! IIUC,你搞混了一些东西。将更新我的答案。 【参考方案1】:IIUC,你把不同的东西混为一谈了。
假设您有一个具有给定方案的分类器。然后你可以在一些数据上训练它,并预测(通常是其他)数据。这很简单,看起来像这样。
首先我们构建预测器并对其进行拟合。
from sklearn import svm, grid_search, datasets
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
clf = svm.SVC()
train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target)
>> clf.fit(train_x, train_y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
现在已经完全构建好了,可以用它来预测了。
>> clf.predict(test_x)
array([1, 0, 0, 2, 0, 1, 1, 1, 0, 2, 2, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 2, 0,
1, 0, 2, 0, 2, 1, 2, 1, 2, 2, 2, 1, 0, 0, 0])
就这么简单。
这里发生了什么?
分类器有一个完全指定的方案——它只需要调整它的参数
分类器根据训练数据调整其参数
分类器已准备好进行预测
在许多情况下,分类器有一个需要使用参数调整的方案,但它也有元参数。一个示例是分类器的 degree
参数。
你应该如何调整它们?有很多方法。
不要。坚持使用默认值(这就是我的示例所做的)
使用某种形式的交叉验证(例如,网格搜索)
使用某种复杂性度量,例如 AIC、BIC 等。
所以重要的是不要把这些东西混在一起。交叉验证不是获得测试数据预测器的技巧。具有默认参数的预测器已经可以做到这一点。交叉验证用于调整元参数。一旦你选择了它们,你就可以调整参数。那么你就有了一个不同的预测器。
【讨论】:
嗨,阿米,我已经编辑了我的问题。希望我现在能够更好地解决我的困境。谢谢:) 你的问题现在好多了,让我(我想)明白了。查看更新。以上是关于使用 sklearn 使用 k 折叠预测测试数据的类别的主要内容,如果未能解决你的问题,请参考以下文章
在 k-Fold 交叉验证中,是不是为 Sklearn 中的每个折叠启动了一个新模型?