Python scikit-learn классификация со смешанными типами данных (текстовые, числовые, категориальные) - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь выполнить классификацию в Python, используя Pandas и scikit-learn. Мой набор данных содержит сочетание текстовых переменных, числовых переменных и категориальных переменных.

Допустим, мой набор данных выглядит следующим образом:

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 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
  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 ]

0 голосов
/ 26 июня 2019

Замените

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 вы можете напрямую подавать категориальные переменные в модели в виде текста.

0 голосов
/ 31 октября 2018

Проблема возникает на шаге 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', если вы хотите включить ее в качестве функции в вашу модель.

...