我正在尝试使用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
包含我的数据集):
我将类别Project Category
和Project 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
然后我使用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
因此,由于所有变量现在都是数值,所以我认为开始训练模型会很好
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
取代了。
对此有任何帮助吗?有没有很好的方法来使用具有各种数据类型的变量进行分类?谢谢。
答案 0 :(得分:1)
替换此
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只是不同。您可以使用“一键编码”(在熊猫中可以使用“ 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,您可以将类别变量直接作为文本输入模型。
答案 1 :(得分:0)
在第2步中,问题tfidf_vectorizer.fit_transform(df['Project Description'])
出现,因为tfidf_vectorizer.fit_transform returns a sparse matrix,然后以压缩形式存储在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”上添加最后一行。