使用k折交叉验证预测测试数据的类别

我正在进行一个数据挖掘项目,并使用Python中的sklearn包来对我的数据进行分类。

为了训练我的数据并评估预测值的质量,我使用了sklearn.cross_validation.cross_val_predict函数。

然而,当我尝试在测试数据上运行我的模型时,它要求提供基本类,而这些类是不可用的。

我看到了一些可能的解决方法,使用sklearn.grid_search.GridSearchCV函数,但我不愿意在固定参数集上使用这种方法。

在查阅sklearn.cross_validation的文档时,我发现了cross_val_score函数。由于我对分类问题领域还比较新,我不太确定这个函数是否能解决我的问题。

任何帮助都将非常棒!

谢谢!

编辑:

你好!我觉得我最初的查询相当模糊。我会尽量详细说明我到底在做什么。开始吧:

我生成了三个numpy.ndarray,分别是X、X_test和y,它们的行数分别为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    # 然后我创建参数网格(grid)和适当的评分函数(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函数,我会睡得更好。


回答:

如果我理解正确的话,你把不同的事情混淆了。

假设你有一个给定方案的分类器。然后你可以用一些数据训练它,并预测(通常是其他)数据。这非常简单,看起来像这样。

首先我们构建预测器并拟合它。

from sklearn import svm, grid_search, datasetsfrom sklearn.cross_validation import train_test_splitiris = 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等


所以重要的是不要把这些事情混淆。交叉验证不是获取测试数据预测器的某种技巧。具有默认参数的预测器已经可以做到这一点。交叉验证是用于调整元参数的。一旦你选择了它们,你就调整参数。然后你就有了另一个不同的预测器。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注