【问题标题】:Plotting Recursive feature elimination (RFE) with cross-validation with a Decision Tree in scikit-learn在 scikit-learn 中使用决策树绘制具有交叉验证的递归特征消除 (RFE)
【发布时间】:2013-10-11 03:57:29
【问题描述】:

我想在 SciKitLearn 中使用决策树和 kNN 绘制“使用交叉验证的递归特征消除”,如文档中的 here

我想在我已经使用的分类器中实现这一点,以同时输出两个结果。但是,它一直给我一个错误。

这是我为 DT 修改的代码:

from collections import defaultdict

import numpy as np
from sklearn.cross_validation import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sk.learn.feature_selection import RFECV
from sklearn.metrics import zero_one_loss


from scipy.sparse import csr_matrix

lemma2feat = defaultdict(lambda: defaultdict(float))  # { lemma: {feat : weight}}
lemma2cat = dict()
features = set()


with open("input.csv","rb") as infile:
    for line in infile:
        lemma, feature, weight, tClass = line.split()
        lemma2feat[lemma][feature] = float(weight)
        lemma2cat[lemma] = int(tClass)
        features.add(feature)


sorted_rows = sorted(lemma2feat.keys())
col2index = dict()
for colIdx, col in enumerate(sorted(list(features))):
    col2index[col] = colIdx

dMat = np.zeros((len(sorted_rows), len(col2index.keys())), dtype = float)


# populate matrix
for vIdx, vector in enumerate(sorted_rows):
    for feature in lemma2feat[vector].keys():
        dMat[vIdx][col2index[feature]] = lemma2feat[vector][feature]


# sort targ. results.


res = []
for lem in sorted_rows:
    res.append(lemma2cat[lem])


clf = DecisionTreeClassifier(random_state=0)
rfecv = RFECV(estimator=DecisionTreeClassifier, step1, cv=10, 
              scoring='accuracy')
rfecv.fit(dMat)

print("Optimal number of features : %d" % rfecv.n_features_)

# Plot number of features VS. cross-validation scores
import pylab as pl
pl.figure()
pl.xlabel("Number of features selected")
pl.ylabel("Cross validation score (nb of misclassifications)")
pl.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
pl.show()

print "Acc:"
print cross_val_score(clf, dMat, np.asarray(res), cv=10, scoring = "accuracy")

错误从第 56 行开始,更具体地说:rfecv = RFECV(estimator=DecisionTreeClassifier, step1, cv=10, SyntaxError: 关键字 arg 后的非关键字 arg

谁能提供有关如何更正我的代码以至少使用 DT 实现此功能的见解?

ogrisel 的以下回复似乎解决了该论点的问题,但引发了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "input.py", line 58, in <module>
    rfecv.fit(col_index, rows)
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 321, in fit
    X, y = check_arrays(X, y, sparse_format="csr")
  File "/anaconda/python.app/Contents/lib/python2.7/site-packages/sklearn/utils/validation.py", line 211, in check_arrays
    % (size, n_samples))
ValueError: Found array with dim 267. Expected 16

似乎 RFE 正在读取相反的输入文件格式(因为我的输入包含 16 个特征和 267 个目标)。这样,如何才能正确地将 dims 提供到代码中?

谢谢。

【问题讨论】:

    标签: python scikit-learn decision-tree rfe


    【解决方案1】:

    SyntaxError: non-keyword arg after keyword arg 非常明确:不能在关键字参数estimator=DecisionTreeClassifier 之后传递非关键字参数(例如step1)。

    所以在这种情况下,正确的语法是删除第一个 arg 的 estimator= 前缀:

    rfecv = RFECV(DecisionTreeClassifier, step1, cv=10, 
                  scoring='accuracy')
    

    现在你会得到另一个错误:RFECV 需要一个模型的实例而不是一个类作为第一个参数。要使用默认决策树参数,只需使用:

    rfecv = RFECV(DecisionTreeClassifier(), step1, cv=10, 
                  scoring='accuracy')
    

    【讨论】:

    • 感谢 ogrisel 的洞察力。但是,它似乎仍然引发了以下错误:请参阅修改后的问题:
    • 转置一个numpy数组X,使用X.Tnumpy.transpose(X)。所有 scikit-learn 模型都需要形状为 (n_samples, n_features) 的数据。 “样本”有时也称为“实例”或“观察”。
    • 如果您不了解 numpy 形状的工作原理,请从 numpy 教程开始,例如:scipy-lectures.github.io
    • 谢谢 ogrisel,我一定会咨询的。然而,正如您在代码中看到的那样,我将数据输入为稀疏矩阵 (dMat)。这样,我的问题是看看如何在fit中调用每个变量。我也怀疑 DT 是否允许 RFE 函数,因为我已经尝试放置 fit(X,y) 并且在这样做时我得到错误:ranking_ = rfe.fit(X_train, y_train).ranking_ File "/anaconda /python.app/Contents/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py”,第 148 行,如果 estimator.coef_.ndim > 1:AttributeError: 'DecisionTreeClassifier' 对象没有属性' coef_'
    • 确实如此:RFECV 目前仅支持具有coef_ 属性的线性模型。不过,应该可以推广使用决策树(森林)的feature_importances_ 属性。
    猜你喜欢
    • 2017-03-30
    • 2019-03-25
    • 2013-08-17
    • 2018-05-21
    • 2019-12-11
    • 2015-11-13
    • 2017-11-24
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多