2016-01-19 1 views
1

Я работаю над проблемой классификации. Этикетки Я пытаюсь предсказать:Scikit Learn: RandomForest: clf.predict работает с float, но не clf.score

df3['relevance'].unique() 
array([ 3. , 2.5 , 2.33, 2.67, 2. , 1. , 1.67, 1.33, 1.25, 
     2.75, 1.75, 1.5 , 2.25]) 

Когда я называю предсказать с помощью функций, которые я сделал, он хорошо работает:

clf = RandomForestClassifier() 
clf.fit(df3[features], df['relevance']) 
pd.crosstab(clf.predict(df3[features]), df3['relevance']) 

Но когда я называю clf.score:

clf.score(df3['features'], df3['relevance']) 

Я получаю ValueError: непрерывное не поддерживается

Должен ли я быть с lassifying метка релевантности, которую я пытаюсь предсказать как другой тип данных? Спасибо за любую помощь.

ответ

1

Проблема, с которой вы сталкиваетесь, вероятна, потому что ваш столбец relevance состоит из непрерывных чисел.

Я бы предложил переключиться на RandomForestRegressor(), если вы пытаетесь предсказать непрерывные числа. В противном случае преобразуйте переменные в 1s и 0s на основе некоторого порогового значения.

+0

tthanks @ericmjl - регрессора сделал работу. Теперь, чтобы прочитать об этом. –

1

Просто кодируйте метки как целые числа, и все будет хорошо работать. Поплавки предполагают регрессию.

В частности, вы можете использовать LabelEncoder http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

>>> from sklearn.ensemble import RandomForestClassifier as RF 
>>> import numpy as np 
>>> X = np.array([[0], [1], [1.2]]) 
>>> y = [0.5, 1.2, -0.1] 
>>> clf = RF() 
>>> clf.fit(X, y) 
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', 
      max_depth=None, max_features='auto', max_leaf_nodes=None, 
      min_samples_leaf=1, min_samples_split=2, 
      min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, 
      oob_score=False, random_state=None, verbose=0, 
      warm_start=False) 
>>> print clf.score(y, X) 
Traceback (most recent call last): 
[.....] 
ValueError: continuous is not supported 
>>> y = [0, 1, 2] 
>>> clf.fit(X, y) 
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', 
      max_depth=None, max_features='auto', max_leaf_nodes=None, 
      min_samples_leaf=1, min_samples_split=2, 
      min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, 
      oob_score=False, random_state=None, verbose=0, 
      warm_start=False) 
>>> print clf.score(X, y) 
1.0 

или вычислить .score себя, так как это очень тривиальной

print np.mean(clf.predict(X) == y) 
+0

thanks @lejlot - интересное использование среднего значения numpy. –

Смежные вопросы