voi*_*oid 1 python classification feature-extraction pandas scikit-learn
我想根据我拥有的不同特征(文本和数字)进行二元分类。训练数据是熊猫数据框的形式。我的管道看起来像这样:
final_pipeline = Pipeline([('union', FeatureUnion(
transformer_list=[('body_trans', Pipeline([('selector', ItemSelector(key='body')),
('count_vect', CountVectorizer())])),
('body_trans2', Pipeline([('selector', ItemSelector(key='body2')),
('count_vect', TfidfVectorizer())])),
('length_trans', Pipeline([('selector', ItemSelector(key='length')),
('min_max_scaler', MinMaxScaler())]))],
transformer_weights={'body_trans': 1.0,'body_trans2': 1.0,'length_trans': 1.0})),
('svc', SVC())])
Run Code Online (Sandbox Code Playgroud)
ItemSelector 看起来像这样:
class ItemSelector(BaseEstimator, TransformerMixin):
def __init__(self, key):
self.key = key
def fit(self, x, y=None):
return self
def transform(self, data_frame):
return data_frame[[self.key]]
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试时final_pipeline.fit(X_train, y_train)
,它给了我ValueError: blocks[0,:] has incompatible row dimensions
例外。
X_train, X_test, y_train, y_test = train_test_split(train_set, target_set)
Run Code Online (Sandbox Code Playgroud)
是我获取训练数据的方式。
train_set
是的字段的数据帧body
,body2
,length
等target_set
与只叫领域的数据帧label
这是我的实际标签进行分类。
编辑:
我认为我输入到管道的数据格式不正确。
train_set
是我的训练数据的特征,样本:
body length body2
0 blah-blah 193 blah-blah-2
1 blah-blah-blah 153 blah-blah-blah-2
Run Code Online (Sandbox Code Playgroud)
和target_set
,这是带有分类标签的 DataFrame
label
0 True
1 False
Run Code Online (Sandbox Code Playgroud)
如果有关于使用 DataFrames 的管道拟合参数的输入格式的任何教程,请提供链接!我找不到有关如何在使用多列作为单独功能的同时加载 DataFrame 作为管道输入的正确文档。
任何帮助表示赞赏!
问题出在您的 ItemSelector 中。它输出一个二维数据帧,但 CountVectorizer 和 TfidfVectorizer 需要一个一维字符串数组。
显示 ItemSelector 输出的代码:-
import numpy as np
from pandas import DataFrame
df = DataFrame(columns = ['body','length','body2'],data=np.array([['blah-blah', 193, 'blah-blah-2'],['blah-blah-2', 153, 'blah-blah-blah-2'] ]))
body_selector = ItemSelector(key='body')
df_body = body_selector.fit_transform(df)
df_body.shape
# (2,1)
Run Code Online (Sandbox Code Playgroud)
您可以定义另一个类,该类可以将要以正确形式呈现给下一步的数据分解。
将此类添加到您的代码中,如下所示:
class Converter(BaseEstimator, TransformerMixin):
def fit(self, x, y=None):
return self
def transform(self, data_frame):
return data_frame.values.ravel()
Run Code Online (Sandbox Code Playgroud)
然后像这样定义你的管道:
final_pipeline = Pipeline([('union', FeatureUnion(
transformer_list=[('body_trans', Pipeline([('selector', ItemSelector(key='body')),
('converter', Converter()),
('count_vect', CountVectorizer())])),
('body_trans2', Pipeline([('selector', ItemSelector(key='body2')),
('converter', Converter()),
('count_vect', TfidfVectorizer())])),
('length_trans', Pipeline([('selector', ItemSelector(key='length')),
('min_max_scaler', MinMaxScaler())]))],
transformer_weights={'body_trans': 1.0,'body_trans2': 1.0,'length_trans': 1.0})),
('svc', SVC())])
Run Code Online (Sandbox Code Playgroud)
无需将其添加到第三部分,因为 MinMaxScalar 需要二维输入数据。
如果有任何问题,请随时询问。
归档时间: |
|
查看次数: |
1724 次 |
最近记录: |