我将sklearn中的ColumnTransformer
用作使用混合数据类型进行多分类的管道的一部分,但是在模型拟合期间出现错误。
广泛的想法与this post的最高答案中的第三个建议一致。该方法涉及一袋单词模型,该模型将预测的概率提供给具有另一个功能的第二分类器(“堆叠”)。但我也想对该数值特征平均填充缺失值。我的代码基于这些sklearn示例one two的混合。
我已经能够使用与那些解决方案中的代码直接对应的代码来隔离处理两种数据类型。但是,当我尝试一起处理这两种数据类型时,似乎出错了。
仅当我将2功能训练数据拟合为2d数组时,文本数据处理才起作用,然后在列处理期间将其变成两个单独的1d数组(我想这是因为每种数据类型只有一列)。虽然数值数据处理仅在我将2个特征数据适合作为数据框时才有效,然后在列处理期间变成2个单独的Pandas系列(或者,如果处理是在2d数组上,则同样适用)。
根据我的阅读,变形金刚通常只适用于2d数组,我想其中包括FunctionTransformer
。因此,我的想法是使用FunctionTransformer
将文本数据类型的Pandas系列转换为一维数组,然后再进行矢量化处理,然后将预测的概率作为Pandas系列返回。
数据看起来像这样
free_text age label
index
0 "example text 1 is great" 52 1
1 "example text 2 is awesome" NaN 0
2 "example text 3 is amazing" 26 0
... ..... ... ..
... .... ... ..
这是我的代码
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import FunctionTransformer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import SVC
def to_series(X):
return pd.Series(X)
def to_1d_array(X):
return X.values
pipeline = Pipeline([
('union', ColumnTransformer(
[
#Pipeline for standard bag-of-words model for body (first column)
('text', Pipeline([('1D array', FunctionTransformer(to_1d_array)),
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', ClassifierWrapper(MultinomialNB())),
('Back to Series', FunctionTransformer(to_series))]), ["free_text"]),
# Pipeline for infilling age (second column)
('age', Pipeline(steps=[('imputer', SimpleImputer(strategy='mean'))]),
["age"]),],
# weight components in FeatureUnion
transformer_weights={
'text': 1,
'num': 1,
},
)),
# Use a SVC classifier on the combined features
('svc', SVC(kernel='linear')),])
pipeline.fit_transfrom(data[["free_text", "age"]], data.label.values)
我收到的错误消息不是很好的拟合模型: ValueError:无法将字符串转换为float:
根据错误消息,可能由于行的原始数据类型为str并以此预测概率形式的浮点数替换而无法正常工作。我也尝试了相反的方法-将1D数组转换为2d数组,然后使用FunctionTransformer返回,但正如它预期的那样,它不起作用。
最终,我可能高估了ColumnTransformer的功能。