首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有元分类器的管道

具有元分类器的管道
EN

Stack Overflow用户
提问于 2017-11-18 23:03:33
回答 1查看 439关注 0票数 0

我正在尝试对来自熊猫数据帧的不同特征训练一个元分类器。

这些特征本质上要么是文本的,要么是分类的。

我在拟合模型时遇到了问题,错误如下:“发现样本数量不一致的输入变量: 1,48678”。我理解这个错误的含义,但不知道如何修复它。非常感谢您的帮助!

我使用的代码如下:

代码语言:javascript
复制
import pandas as pd
from sklearn import preprocessing
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.feature_extraction.text import TfidfVectorizer

# set target label
target_label = ['target']
features = ['cat_1', 'cat_2', 'cat_3', 'cat_4', 'cat_5', 
'text_1']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cleansed_data[features], 
cleansed_data[target_label], test_size=0.2, random_state=0)

text_features = ['text_1']
categorical_features = ['cat_1', 'cat_2', 'cat_3', 'cat_4', 'cat_5']

# encoder
le = preprocessing.LabelEncoder()

# vectoriser
vectoriser = TfidfVectorizer()

# classifiers
mlp_clf = MLPClassifier()
rf_clf = RandomForestClassifier()

from sklearn.base import TransformerMixin, BaseEstimator
class SelectColumnsTransfomer(BaseEstimator, TransformerMixin):

    def __init__(self, columns=[]):
    self.columns = columns

    def transform(self, X, **transform_params):
        trans = X[self.columns].copy()
        return trans

    def fit(self, X, y=None, **fit_params):
    return self

# text pipeline
text_steps = [('feature extractor', SelectColumnsTransfomer(text_features)),
          ('tf-idf', vectoriser),
          ('classifier', mlp_clf)]

# categorical pipeline
categorical_steps = [('feature extractor', 
SelectColumnsTransfomer(categorical_features)),
                 ('label encode', le),
                 ('classifier', rf_clf)]

pl_text = Pipeline(text_steps)
pl_categorical = Pipeline(categorical_steps)

pl_text.fit(X_train, y_train)

from mlxtend.classifier import StackingCVClassifier
sclf = StackingCVClassifier(classifiers=[pl_text, pl_categorical],
                      use_probas=True,
                      meta_classifier=LogisticRegression())

编辑:这里有一些重现这个问题的代码。'ValueError:发现样本数量不一致的输入变量: 1,3‘

代码语言:javascript
复制
d = {'cat_1': ['A', 'A', 'B'], 'cat_2': [1, 2, 3], 
'cat_2': ['G', 'H', 'I'], 'cat_3': ['AA', 'DD', 'PP'], 
'cat_4': ['X', 'B', 'V'], 
'text_1': ['the cat sat on the mat', 'the mat sat on the cat', 'sat on the cat mat']} 
features = pd.DataFrame(data=d)

t = [0, 1, 0]
target = pd.DataFrame(data=t)

text_features = ['text_1']
categorical_features = ['cat_1', 'cat_2', 'cat_3', 'cat_4', 'cat_5']

# text pipeline
text_steps = [('feature extractor', SelectColumnsTransfomer(text_features)),
              ('tf-idf', vectoriser),
              ('classifier', mlp_clf)]

# categorical pipeline
categorical_steps = [('feature extractor', 
SelectColumnsTransfomer(categorical_features)),
                 ('label encode', le),
                 ('classifier', rf_clf)]

pl_text = Pipeline(text_steps)
pl_categorical = Pipeline(categorical_steps)

pl_text.fit(features, target)

from mlxtend.classifier import StackingCVClassifier
sclf = StackingCVClassifier(classifiers=[pl_text, pl_categorical],
                          use_probas=True,
                          meta_classifier=LogisticRegression())

sclf.fit(features, target)
EN

回答 1

Stack Overflow用户

发布于 2017-11-19 04:46:27

好的,我通过将text_features = 'text_1‘替换为text_features = 'text_1’来设法让它工作。

基本上,当您将'text_1‘传递给SelectColumnsTransfomer类时,它将返回一个DataFrame对象,tfidf向量器将该对象视为一个输入。向量化器在流水线中应用fit_transform并返回单个值。此单个值不能用于预测三个目标值。

如果你传入'text_1',这将得到一个序列,并且向量器将正确地识别出你有三个字符串作为特征。你的文本管道现在可以工作了。

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

https://stackoverflow.com/questions/47367466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档