Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用管道和FeatureUnion添加要素_Python_Scikit Learn_Pipeline_Sentiment Analysis_Feature Extraction - Fatal编程技术网

Python 如何使用管道和FeatureUnion添加要素

Python 如何使用管道和FeatureUnion添加要素,python,scikit-learn,pipeline,sentiment-analysis,feature-extraction,Python,Scikit Learn,Pipeline,Sentiment Analysis,Feature Extraction,在下面的代码中,我使用一个推特数据集来执行情绪分析。我使用执行以下过程的管道: 1) 执行一些基本的文本预处理 2) 矢量化tweet文本 3) 添加额外功能(文本长度) 4) 分类 我想再增加一个功能,那就是按比例的追随者数量。我编写了一个函数,它将整个数据帧(df)作为输入,并返回一个新的数据帧,其中包含按比例缩放的跟随者数量。但是,我发现在管道上添加此过程很有挑战性,例如,使用sklearn管道将此功能添加到其他功能中 如果您对这个问题有任何帮助或建议,我们将不胜感激 下面的问题和代码来自

在下面的代码中,我使用一个推特数据集来执行情绪分析。我使用执行以下过程的管道:

1) 执行一些基本的文本预处理

2) 矢量化tweet文本

3) 添加额外功能(文本长度)

4) 分类

我想再增加一个功能,那就是按比例的追随者数量。我编写了一个函数,它将整个数据帧(df)作为输入,并返回一个新的数据帧,其中包含按比例缩放的跟随者数量。但是,我发现在管道上添加此过程很有挑战性,例如,使用sklearn管道将此功能添加到其他功能中

如果您对这个问题有任何帮助或建议,我们将不胜感激

下面的问题和代码来自Ryan的帖子:


导入nltk
进口稀土
从sklearn.feature\u extraction.text导入countvectorier
从sklearn.linear_模型导入逻辑回归
从sklearn.model\u选择导入列车\u测试\u拆分
从sklearn.preprocessing导入MinMaxScaler
def导入_数据(文件名、sep、英语、标题=无、skiprows=1):
#读取csv
dataset=pd.read\u csv(文件名,sep=sep,engine=eng,header=header,skiprows=skiprows)
#重命名列
dataset.columns=[“文本”,“关注者”,“情感]]
返回数据集
df=import_数据('apple_v3.txt'、'\t'、'python')
十、 y=df.text,df.touction
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y)
tokenizer=nltk.casual.TweetTokenizer(保留大小写=False,减少大小写=True)
count\u vect=CountVectorizer(标记器=tokenizer.tokenize)
分类器=逻辑回归()
def获取缩放的跟随者(df):
scaler=MinMaxScaler()
df[['followers']=df[['followers']].astype(浮点)
df[['followers']=scaler.fit_变换(df[['followers']]
followers=df['followers']。值
followers_remoded=followers.remode((len(followers),1))
返回df
def get_tweet_长度(文本):
返回len(文本)
将numpy作为np导入
def genericize_提及(文本):
返回re.sub(r'@[\w_-]+','thisisanatitle',text)
def重塑特征列(系列):
返回np.整形(np.阵列(系列),(透镜(系列),1))
def管道化功能(功能,激活=真):
def list_理解_函数(list_或_系列,活动=真):
如果激活:
已处理=[列表_或_系列中i的函数(i)]
已处理=重塑特征列(已处理)
已处理退货
其他:
返回重塑特征列(np.zero(len(列表或系列)))
从sklearn.pipeline导入功能联合,管道
从sklearn\u助手导入管道化、泛化、训练测试和评估
情感管道=管道([
('genericize_-tensions',pipeline(genericize_-tensions,active=True)),
(“特色”,特色联盟)([
(“矢量器”,计数向量),
('post_length',pipelineze_功能(get_tweet_length,active=True))
])),
(“分类器”,分类器)
])
情绪管道,混淆矩阵=训练测试和评估(情绪管道,X\U训练,y\U训练,X\U测试,y\U测试)

您可以使用
FeatureUnion
组合从数据帧的不同列中提取的特征。您应该将数据帧馈送到管道,并使用
FunctionTransformer
提取特定列。它可能看起来像这样(我没有运行它,可能会出现一些错误)


另一个解决方案是不使用
管道
,只需将功能与
np.hstack

堆叠在一起。目前为止,我找到的最好的解释是在以下帖子中:

我的数据包括异构特征,以下逐步方法效果良好,易于理解:

来自sklearn.base导入BaseEstimator,TransformerMixin
从sklearn.pipeline导入管道,FeatureUnion
#步骤1-从dataframe中选择数据,并将数据集拆分为训练集和测试集
features=[c代表df.columns.values中的c,如果c不在['emotional']]
数值_特征=[c代表df.columns中的c.values,如果c不在['text','touction']]
目标=‘情绪’
X_序列,X_测试,y_序列,y_测试=序列测试分割(df[特征],df[目标],测试大小=0.33,随机状态=42)
#步骤2-创建数字选择器类和文本选择器类。这些类允许从数据帧中选择特定列
类号选择器(基估计量、转换项):
def uuu init uuuu(self,key):
self.key=key
def配合(自身、X、y=无):
回归自我
def变换(自,X):
返回X[[self.key]]
类文本选择器(BaseEstimator,TransformerMixin):
def uuu init uuuu(self,key):
self.key=key
def配合(自身、X、y=无):
回归自我
def变换(自,X):
返回X[自密钥]
#步骤3:为文本数据创建一条管道,为数字数据创建一条管道
文本=管道([
('selector',TextSelector(key='content')),
('tfidf',tfidfvectorier(stop_words='english'))
])
text.fit\u变换(X\u列)
追随者=管道([
('selector',NumberSelector(key='followers')),
('standard',MinMaxScaler())
])
followers.fit_变换(X_列)
#第4步-特征联合
专长=专长联盟([('text',text),
('length',followers)])
特征处理=管道([('feats',feats)])
特征处理。拟合变换(X列)
#步骤5-添加分类器并预测
管道=管道([
(“特征”,壮举),
('classifier',SVC(内核='linear',概率=True,C=1,类权重='balanced'))
])
管道安装(X_系列、y_系列)
preds=管道预测(X_测试)
np.平均值(preds==y_检验)
#步骤6:使用模型预测未包含在测试集中的新数据
#在我的示例中,管道需要一个数据帧作为输入,它应该有一个名为“text”的列和一个名为“followers”的列
数组=[“@apple是惊人的”,25000]]
sentiment_pipeline = Pipeline([
    FeatureUnion([
      # your added feature (maybe you'll need to reshape it so ndim == 2)
      ('scaled_followers', FunctionTransformer(lambda df: get_scalled_followers(df).values,
                                               validate=False)),
      # previous features
      ('text_features', Pipeline([
        ('extractor', FunctionTransformer(lambda df: df.text.values, validate=False))
        ('genericize_mentions', pipelinize(genericize_mentions, active=True)),
        ('features', FeatureUnion([
                  ('vectorizer', count_vect),
                  ('post_length', pipelinize_feature(get_tweet_length, active=True))
        ])),
      ]))
    ]),
    ('classifier', classifier)
])


sentiment_pipeline, confusion_matrix = train_test_and_evaluate(sentiment_pipeline, df_train, y_train, df_test, y_test)