带有CountVectorizer和其他预测变量的sklearn DecisionTreeClassifier

问题描述 投票:0回答:1

我已经使用sklearn的DecisionTreeClassifier建立了文本分类模型,并希望添加另一个预测变量。我的数据在pandas数据框中,其中的列分别标记为“印象”(文本),“体积”(浮点数)和“癌症”(标签)。我一直只用印象来预测癌症,但想用印象和体积来预测癌症。

我之前运行的代码没有问题:

X_train, X_test, y_train, y_test = train_test_split(data['Impression'], data['Cancer'], test_size=0.2)

vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(X_train)
X_test = vectorizer.transform(X_test)

dt = DecisionTreeClassifier(class_weight='balanced', max_depth=6, min_samples_leaf=3, max_leaf_nodes=20)
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)

我尝试了几种不同的方法来添加音量预测值(以粗体显示的更改:

1)仅fit_transform个展示次数

X_train, X_test, y_train, y_test = train_test_split(data[['Impression', 'Volume']], data['Cancer'], test_size=0.2)

vectorizer = CountVectorizer()
X_train['Impression'] = vectorizer.fit_transform(X_train['Impression'])
X_test = vectorizer.transform(X_test)

dt = DecisionTreeClassifier(class_weight='balanced', max_depth=6, min_samples_leaf=3, max_leaf_nodes=20)
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)

这引发错误

TypeError: float() argument must be a string or a number, not 'csr_matrix'
...
ValueError: setting an array element with a sequence.

2)在展示次数和音量上都调用fit_transform。除fit_transform行外,与上述代码相同:

X_train = vectorizer.fit_transform(X_train)

这当然会引发错误:

ValueError: Number of labels=1800 does not match number of samples=2
...
X_train.shape
(2, 2)
y_train.shape
(1800,)

我很确定方法1是正确的方法,但是我找不到如何将float预测变量添加到此文本分类模型的任何教程或解决方案。

任何帮助将不胜感激!

python machine-learning scikit-learn decision-tree
1个回答
0
投票

您可以使用hstack将两个功能组合在一起。

from scipy.sparse import hstack
X_train = vectorizer.fit_transform(X_train)
X_train_new = hstack(X_train, np.array(data['Volume']))

现在,您的新火车包含这两个功能。如果我可以建议的话,请使用tfidfvectorizer而不是countvectorizer,因为tfidf考虑了每个文档/含义中单词的重要性,而countvectorizer仅计算单词出现的次数,因此“ THE”一词的重要性要高于那些真正重要的单词。我们。

© www.soinside.com 2019 - 2024. All rights reserved.