我有26篇文章被分类为二元类别,我进行了NB和5倍CV分析。我用load_files()
命令导入了我的数据,得到了这个数组:
target': array([0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1]),
'target_names': ['negative', 'positive']
尽管我在scikit学习网站上阅读了LOO文档和用户指南,但我无法掌握如何使用我的数据。以下是该网站的示例:
from sklearn import cross_validation
X = np.array([[1, 2], [3, 4]])
y = np.array([1, 2])
loo = cross_validation.LeaveOneOut(2)
len(loo)
2
print(loo)
sklearn.cross_validation.LeaveOneOut(n=2)
for train_index, test_index in loo:
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print(X_train, X_test, y_train, y_test)
例如,在scikit学习网站的上述示例中,y代表什么?是分类吗?什么是train_index/test_index?这是从哪里来的?
如有帮助,不胜感激。
问候,
guzdeh
更新:
谢谢你的回复,布拉德。如果我理解你的答案,我需要将我的数据划分为训练/测试集?我在NB分析(75:25)中做到了这一点,但在5倍CV实现中,这种分割(80:20)是由算法执行的。这是我的代码(使用4个不同的分类器):
def evaluate_cross_validation(clf, X, y, K):
# create a k-fold cross validation iterator of k=5 folds
cv = KFold(len(y), K, shuffle=True, random_state=0)
# by default the score used is the one returned by score >>> method of the estimator (accuracy)
scores = cross_val_score(clf, X, y, cv=cv)
print scores
print ("Mean score: {0:.3f} (+/-{1:.3f})").format(np.mean(scores), sem(scores))
clfs = [clf_1, clf_2, clf_3, clf_4]
for clf in clfs:
evaluate_cross_validation(clf, bunch.data, bunch.target, 5)
Bunch.data
是我加载了load_files()
的文章,bunch.target
是我的两个类。所以,如果我的想法是正确的,去掉一个是N倍CV,那么我可以用前面提到的代码做分析,K=文章数量?
然而,我仍然不明白y = np.array([1, 2])
在上面的例子中是什么,以及为什么需要训练集和测试集,因为除了一篇文章是训练集,另一篇是测试集。
因此,对于这类ML算法,您需要了解"特征"、"目标"、"训练集"one_answers"测试集"之间的差异。数据集中似乎只有一个目标。这些将是您试图预测的值。因此,在这种算法的情况下,X_train
必须是有关文章的信息,y_train
将是您提供的数组的相关negative
或positive
值。X_test
和y_test
将是你使用算法预测的特征、目标对,然后评分来估计你的设置的有效性
把features
想象成线索,有一个线索列表,你正试图学习如何把这些线索放在一起来预测target
。现在,你所拥有的只是答案(目标),没有任何线索,任何学习都不可能像那样发生。
就index
而言,我建议使用Pandas这样的库来创建具有内置索引的数据帧
http://pandas.pydata.org/
这有点缺乏细节,因为没有太多的事情要做,但这应该会让你朝着正确的方向前进。