2015-04-07 2 views
1

Я использую следующий код для классификации многоклассов, который использует GradientBoostingClassifier из scikit-learn. Я столкнулся с известной проблемой с разреженной матрицей Преобразование в плотную матрицу.Gradient Boosting Классификатор разреженной матрицы с использованием pandas и scikit

Я применил следующее решение stackoverflow, но оно не работает для моего дела. Хотя решение, которое я использовал, предназначено для RandomForestClassifier, но AFAIK должно работать для GradientBoostingClassifier!

Также, чтобы добавить этот код, отлично работает, если я заменил GradientBoostingClassifier на RandomForestClassifier.

Данные в этом случае являются числовыми 93 функциями с 8 целевыми классами. Данные могут быть выбраны из Kaggle

# load data 
train = pd.read_csv('data/train.csv') 
test = pd.read_csv('data/test.csv') 
sample = pd.read_csv('submissions/sampleSubmission.csv') 
labels = train.target.values 
ids = train.id.values 
train = train.drop('id', axis=1) 
train = train.drop('target', axis=1) 
train_orig = train 
test = test.drop('id', axis=1) 

# transform counts to TFIDF features 
tfidf = feature_extraction.text.TfidfTransformer() 
train = tfidf.fit_transform(train) 
test = tfidf.transform(test).toarray() # Update line 

# encode labels 
lbl_enc = preprocessing.LabelEncoder() 
labels = lbl_enc.fit_transform(labels) 

# train a random forest classifier 
print('starting training ... ') 
clf = ensemble.GradientBoostingClassifier(n_estimators=config.estimators) 
clf.fit(train, labels) 

# predict on test set 
print('starting prediction ... ') 
preds = clf.predict_proba(test) # Error on this line even when test is dense 
train_pred = clf.predict(tfidf.transform(train_orig)) 

TraceBack:

python boosted_trees.py 
starting training ... 
Traceback (most recent call last): 
    File "boosted_trees.py", line 57, in <module> 
    clf.fit(train, labels) 
    File "/usr/local/lib/python2.7/site-  packages/sklearn/ensemble/gradient_boosting.py", line 941, in fit 
    X, y = check_X_y(X, y, dtype=DTYPE) 
    File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 439, in check_X_y 
    ensure_min_features) 
    File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py",  line 331, in check_array 
    copy, force_all_finite) 
    File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py",  line 239, in _ensure_sparse_format 
    raise TypeError('A sparse matrix was passed, but dense ' 
TypeError: A sparse matrix was passed, but dense data is required. Use   X.toarray() to convert to a dense numpy array.ere 
+1

Непонятно, что вы просите, и, не дав следа, почти невозможно помочь. –

+0

Извините, я добавил трассировку! – JehandadK

+0

Вы не сделали данные тренировки плотными. –

ответ

1

Благодаря @imaluengo.

На всякий случай кому-то нужно. Проблема в этих строках.

train = tfidf.fit_transform(train) 
test = tfidf.transform(test).toarray() # Update line 

Обе строки должны иметь toarray(), чтобы исправить это.

train = tfidf.fit_transform(train).toarray() 
test = tfidf.transform(test).toarray() # Update line