首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用CountVectorizer和其他预测器的sklearn DecisionTreeClassifier

使用CountVectorizer和其他预测器的sklearn DecisionTreeClassifier
EN

Stack Overflow用户
提问于 2020-05-21 21:15:42
回答 2查看 511关注 0票数 1

我已经使用sklearn的DecisionTreeClassifier构建了一个文本分类模型,并希望添加另一个预测器。我的数据在一个pandas数据框中,其中的列被标记为'Impression' (文本)、'Volume' (浮动)和'Cancer' (标签)。我一直只使用印象来预测癌症,但我想用印象和体积来预测癌症。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

我尝试了几种不同的方法来添加Volume predictor (以粗体显示的更改):

1)仅fit_transform印象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

这将抛出错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X_train = vectorizer.fit_transform(X_train)

这当然会抛出错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ValueError: Number of labels=1800 does not match number of samples=2
...
X_train.shape
(2, 2)
y_train.shape
(1800,)

我非常确定方法#1是正确的方法,但我还没有找到任何教程或解决方案,关于如何将浮点预测器添加到这个文本分类模型中。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-22 14:48:30

ColumnTransformer()正好可以解决这个问题。我们可以在ColumnTransformer中将remainder参数设置为passthrough,而不是手动将CountVectorizer的输出附加到其他列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
from sklearn import set_config

set_config(print_changed_only='True', display='diagram')

data = pd.DataFrame({'Impression': ['this is the first text',
                                    'second one goes like this',
                                    'third one is very short',
                                    'This is the final statement'],
                     'Volume': [123, 1, 2, 123],
                     'Cancer': [1, 0, 0, 1]})

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

ct = make_column_transformer(
    (CountVectorizer(), 'Impression'), remainder='passthrough')

pipeline = make_pipeline(ct, DecisionTreeClassifier())
pipeline.fit(X_train, y_train)
pipeline.score(X_test, y_test)

使用0.23.0版本,查看管道对象的可视化(set_config中的display参数)

票数 1
EN

Stack Overflow用户

发布于 2020-05-21 21:37:45

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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“这样的单词将比那些对我们真正重要的单词具有更高的重要性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61943972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文