首页 > 解决方案 > 在机器学习中使用 2 列训练数据

问题描述

我有一个名为ds3 列数据的数据框,如下所示

         text     count      label
0   I have...        12        pos   
1   You sh...         8        neg
2   In thi...         9        neg
.
.

我得到了一个示例,仅text用于使用以下代码创建测试和训练数据

X = ds['text']
y = ds['label']
train_X, test_X, train_Y, test_Y = train_test_split(X, y, test_size=0.25, random_state=0)

df_train75 = pd.DataFrame()
df_train75['text'] = train_X
df_train75['label'] = train_Y

df_test25 = pd.DataFrame()
df_test25['text'] = test_X
df_test25['label'] = test_Y

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vect_7525 = TfidfVectorizer(ngram_range = (1, 1))
tfidf_vect_7525.fit(ds['text'])
train_X_tfidf_7525 = tfidf_vect_7525.transform(df_train75['text'])
test_X_tfidf_7525 = tfidf_vect_7525.transform(df_test25['text'])

from sklearn.svm import SVC

model = SVC(kernel='linear')
model.fit(train_X_tfidf_7525,train_Y)

==================================================== =================================

我试图通过简单地更改第一行来包含textcount

X = ds[['text', 'count']

它给了我错误

from sklearn.svm import SVC

model = SVC(kernel='linear')
model.fit(train_X_tfidf_9010,train_Y)

==================================================== =================================

我的问题是,我应该如何解决这个问题?我试图研究其他问题,但没有得到答案。我发现的一个“解决方案”是使用

X = ds['text'].astype(str) + ' ' + ds['count'].astype(str)

但我认为这不是解决这个问题的正确选择。先感谢您!

标签: pythonpandasscikit-learn

解决方案


如果您想分别转换输入的不同列,您应该选择ColumnTransformer. 您还可以选择不转换特定列。在任何情况下,每个(非)转换的结果将再次连接到单个数组中。一个小例子:

from sklearn.compose import ColumnTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import pandas as pd


df = pd.DataFrame({
    'text': ['This is doc1', 'This is doc2', 'Here is doc3']*3,
    'count': [12, 8, 9]*3,
    'label': ['pos', 'neg', 'neg']*3
})

X = df[['text', 'count']]
y = df['label']

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

transformer = ColumnTransformer([
    ('vectorizer', TfidfVectorizer(ngram_range=(1, 1)), 'text')
], remainder='passthrough')

X_vec_train = transformer.fit_transform(X_train)
X_vec_test = transformer.transform(X_test)

model = SVC(kernel='linear')
model.fit(X_vec_train, y_train)

转换器列表的语法是带有 的元组列表(name, transformer, columns),您可以在其中指定将哪个转换器应用于哪个列。通过设置remainder='passthrough',之前未指定的所有剩余列将自动传递并与结果连接。有关这方面的更多信息,请参阅文档


推荐阅读