繁体   English   中英

Python scikit-learn分类与混合数据类型(文本,数字,分类)

[英]Python scikit-learn classification with mixed data types (text, numerical, categorical)

我正在尝试使用Pandas和scikit-learn在Python中执行分类。 我的数据集包含文本变量,数值变量和分类变量的混合。

假设我的数据集看起来像这样:

Project Cost        Project Category        Project Description       Project Outcome
12392.2             ABC                     This is a description     Fully Funded
493992.4            DEF                     Stack Overflow rocks      Expired

我需要预测变量Project Outcome 这是我做的(假设df包含我的数据集):

  1. 我将类别Project CategoryProject Outcome为数值

     df['Project Category'] = df['Project Category'].factorize()[0] df['Project Outcome'] = df['Project Outcome'].factorize()[0] 

数据集现在看起来像这样:

Project Cost        Project Category        Project Description       Project Outcome
12392.2             0                       This is a description     0
493992.4            1                       Stack Overflow rocks      1
  1. 然后我使用TF-IDF处理了文本列

     tfidf_vectorizer = TfidfVectorizer() df['Project Description'] = tfidf_vectorizer.fit_transform(df['Project Description']) 

数据集现在看起来像这样:

Project Cost        Project Category        Project Description       Project Outcome
12392.2             0                       (0, 249)\t0.17070240732941433\n (0, 304)\t0..     0
493992.4            1                       (0, 249)\t0.17070240732941433\n (0, 304)\t0..     1
  1. 因此,由于所有变量现在都是数值,我认为开始训练我的模型会很好

     X = df.drop(columns=['Project Outcome'], axis=1) y = df['Project Outcome'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) model = MultinomialNB() model.fit(X_train, y_train) 

但我得到错误ValueError: setting an array element with a sequence. 当试图做model.fit 当我打印X_train ,我注意到Project Description由于某种原因被NaN取代。

对此有何帮助? 是否有一种使用各种数据类型的变量进行分类的好方法? 谢谢。

问题出现在步骤2中,使用tfidf_vectorizer.fit_transform(df['Project Description'])因为tfidf_vectorizer.fit_transform 返回一个稀疏矩阵 ,然后在df ['Project Description']列中以压扁形式存储。 您希望将结果保持为模型训练和测试的稀疏(或不太理想的密集)矩阵。 这是用于以密集形式准备数据的示例代码

import pandas as pd
import numpy as np
df = pd.DataFrame({'project_category': [1,2,1], 
                   'project_description': ['This is a description','Stackoverflow rocks', 'Another description']})

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(df['project_description']).toarray()
X_all_data_tfidf = np.hstack((df['project_category'].values.reshape(len(df['project_category']),1), X_train_tfidf))

我们在'project_category'上添加的最后一行,如果您想将其作为模型中的特征包含在内。

替换它

df['Project Description'] = tfidf_vectorizer.fit_transform(df['Project Description'])

df['Project Description'] = tfidf_vectorizer.fit_transform(df['Project Description']).toarray()

您还可以使用:tfidf_vectorizer.fit_transform(df ['Project Description'])。todense()

此外,您不应该简单地将类别转换为数字。 例如,如果将A,B和C转换为0,1和2.它们被视为2> 1> 0,因此C> B> A通常不是这种情况,因为A与B和C不同。你可以使用One-Hot-Encoding(在Pandas中你可以使用'get_dummies')。 您可以使用以下代码获取所有分类功能。

#df has all not categorical features
featurelist_categorical = ['Project Category', 'Feature A',
           'Feature B']

for i,j in zip(featurelist_categorical, ['Project Category','A','B']):
  df = pd.concat([df, pd.get_dummies(data[i],prefix=j)], axis=1)

功能前缀不是必需的,但会在多个分类功能的情况下特别为您提供帮助。

此外,如果您不想出于某种原因将功能拆分为数字,则可以使用H2O.ai. 使用H2O,您可以直接将分类变量作为文本提供给模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM