Классификация текста Python LightGBM с помощью Tfidf - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь представить LightGBM для мультиклассификации текста. 2 столбца в кадре данных панд, где «категория» и «содержимое» установлены следующим образом.

Рамка данных:

    contents               category  
1   this is example1...    A  
2   this is example2...    B  
3   this is example3...    C  

*Actual data frame consists of approx 600 rows and 2 columns.

Тем самым я пытаюсь классифицировать текст по 3 категориям следующим образом.

Коды:

import pandas as pd
import numpy as np

from nltk.corpus import stopwords
stopwords1 = set(stopwords.words('english'))

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer 
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV

import lightgbm as lgbm
from lightgbm import LGBMClassifier, LGBMRegressor


#--main code--#  
X_train, X_test, Y_train, Y_test = train_test_split(df['contents'], df['category'], random_state = 0, test_size=0.3, shuffle=True)

count_vect = CountVectorizer(ngram_range=(1,2), stop_words=stopwords1)
X_train_counts = count_vect.fit_transform(X_train)

tfidf_transformer = TfidfTransformer(use_idf=True, smooth_idf=True, norm='l2', sublinear_tf=True)
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

lgbm_train = lgbm.Dataset(X_train_tfidf, Y_train)
lgbm_eval = lgbm.Dataset(count_vect.transform(X_test), Y_test, reference=lgbm_train)

params = {
    'boosting_type':'gbdt',
    'objective':'multiclass',
    'learning_rate': 0.02,
    'num_class': 3,
    'early_stopping': 100,
    'num_iteration': 2000, 
    'num_leaves': 31,
    'is_enable_sparse': 'true',
    'tree_learner': 'data',
    'max_depth': 4, 
    'n_estimators': 50  
    }

clf_gbm = lgbm.train(params, valid_sets=lgbm_eval)
predicted_LGBM = clf_gbm.predict(count_vect.transform(X_test))

print(accuracy_score(Y_test, predicted_LGBM))

Тогда я получил сообщение об ошибке:

ValueError: could not convert string to float: 'b'  

Я также преобразовываю столбец категории ['a', 'b', 'c'] в int как [0, 1, 2], но получаю ошибку как

TypeError: Expected np.float32 or np.float64, met type(int64).

Что не так с моим кодом?
Любые советы / предложения будут с благодарностью.
Заранее спасибо.

1 Ответ

0 голосов
/ 18 мая 2018

Мне удалось разобраться с этой проблемой. Очень просто, но отмечено здесь для справки.

Так как LightGBM ожидает float32 / 64 для ввода, «категориями» должно быть число, а не str. И входные данные должны быть преобразованы в float32 / 64 с помощью .astype ().

Changes1:
добавлено после 4 строк после X_train_tfidf = tfidf_transformer.fit_transform (X_train_counts)

 X_train_tfidf = X_train_tfidf.astype('float32')
 X_test_counts = X_test_counts.astype('float32')   
 Y_train = Y_train.astype('float32')
 Y_test = Y_test.astype('float32')

changes2:
просто преобразуйте столбец «категория»
из [A, B, C, ...] в [0.0, 1.0, 2.0, ...]

Может быть, просто назначение attirbute как TfidfVecotrizer (dtype = np.float32) работает в этом случае.
А поместить векторизованные данные в LGBMClassifier будет намного проще.

Update
Использование TfidfVectorizer намного проще:

tfidf_vec = TfidfVectorizer(dtype=np.float32, sublinear_tf=True, use_idf=True, smooth_idf=True)
X_data_tfidf = tfidf_vec.fit_transform(df['contents'])
X_train_tfidf = tfidf_vec.transform(X_train)
X_test_tfidf = tfidf_vec.transform(X_test)

clf_LGBM = lgbm.LGBMClassifier(objective='multiclass', verbose=-1, learning_rate=0.5, max_depth=20, num_leaves=50, n_estimators=120, max_bin=2000,)
clf_LGBM.fit(X_train_tfidf, Y_train, verbose=-1)
predicted_LGBM = clf_LGBM.predict(X_test_tfidf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...