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

vdv*_*xel 5 python machine-learning pandas scikit-learn

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

  1. 我转换的类别Project CategoryProject Outcome以数值

    df['Project Category'] = df['Project Category'].factorize()[0]
    df['Project Outcome'] = df['Project Outcome'].factorize()[0]
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    tfidf_vectorizer = TfidfVectorizer()
    df['Project Description'] = tfidf_vectorizer.fit_transform(df['Project Description'])
    
    Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

但是ValueError: setting an array element with a sequence.尝试执行时出现错误model.fit。当我打印时X_train,我注意到由于某种原因它Project Description被替换了NaN

有什么帮助吗?有没有很好的方法来使用具有各种数据类型的变量进行分类?谢谢。

kev*_*s_1 1

问题出现在步骤 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))
Run Code Online (Sandbox Code Playgroud)

如果您想将其作为模型中的一项功能包含在内,我们会在“project_category”上添加最后一行。