2016-05-11 3 views
1

Я хочу использовать дерево решений для прогнозирования значения поплавка на основе 6 функций, которые также являются значениями float. Я понимаю, что дерево решений может быть не лучшим методом, но я сравниваю несколько методов, чтобы лучше их понять.«Неизвестный тип метки»: классификатор дерева решений с поплавками

Ошибка, которую я получаю, это «Неизвестный тип ярлыка» в моем списке данных обучения y. Я прочитал, что «DecisionTreeClassifier» принимает значения с плавающей запятой и, как правило, значения в любом случае преобразуются в float 32. Я явным образом устанавливаю значения в моем списке float32, но все еще кажется проблемой, может ли кто-нибудь помочь?

образец моих х обучающих данных (features_x_train):

[[ 2.49496743e-01 6.07936502e-01 -4.20752168e-01 -3.88045199e-02 
    -7.59323120e-01 -7.59323120e-01] 
[ 4.07418489e-01 5.36915325e-02 2.95270741e-01 1.87122121e-01 
    9.89770174e-01 9.89770174e-01]] 

образец моих лет подготовки данных (predict_y_train): [ -7.59323120e-01 9.89770174e-01]

Код ...

df_train = wellbeing_df[feature_cols].sample(frac=0.9) 

#Split columns into predictor and result 
features_x_train = 
np.array(df_train[list(top_features_cols)].values).astype(np.float32) 
predict_y_train = np.asarray(df_train['Happiness score'], dtype=np.float32) 


#Setup decision tree 
decision_tree = tree.DecisionTreeClassifier() 
decision_tree = decision_tree.fit(features_x_train, predict_y_train) 
#Train tree on 90% of available data 

ошибка:

ValueError        Traceback (most recent call last) 
<ipython-input-103-a44a03982bdb> in <module>() 
    19 #Setup decision tree 
    20 decision_tree = tree.DecisionTreeClassifier() 
---> 21 decision_tree = decision_tree.fit(features_x_train, predict_y_train) #Train tree on 90% of available data 
    22 
    23 #Test on remaining 10% 

C:\Users\User\Anaconda2\lib\site-packages\sklearn\tree\tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted) 
    175 
    176   if is_classification: 
--> 177    check_classification_targets(y) 
    178    y = np.copy(y) 
    179 

C:\Users\User\Anaconda2\lib\site-packages\sklearn\utils\multiclass.pyc in check_classification_targets(y) 
    171  if y_type not in ['binary', 'multiclass', 'multiclass-multioutput', 
    172    'multilabel-indicator', 'multilabel-sequences']: 
--> 173   raise ValueError("Unknown label type: %r" % y) 
    174 
    175 

ValueError: Unknown label type: array([[ -7.59323120e-01], 
     [ 9.89770174e-01], 

Также, если я меняю список на строковые значения, тогда код запускается

ответ

1

Дерево решений Классификатор, is, well ... классификатор. Классификатор является оценкой функции из некоторого произвольного пространства (обычно R^d) в Конечный пространство значений, называемое Площадь этикетки. Следовательно, python (scikit-learn) ожидает, что вы передадите что-то вроде меток, например: integer, string и т. Д. Floats не являются типичной формой кодирования конечным пространствами, они используются для регрессии.

Таким образом, вы, кажется, вводите в заблуждение классификацию и регрессию. Как отличить?

  • если у вас есть у как поплавки, но только может быть получено конечное число различных значений и все они получают в обучающем наборе, то это классификация - просто конвертировать значения в строки или целые числа, и вам хорошо идти.
  • если у вас есть у как поплавки, и это являются actuall реальных значения, и вы можете иметь много значений, даже не видели в обучающем наборе, и вы ожидаете ваша модель, чтобы как-то «интерполировать» это регрессия и вместо этого вы должны использовать DecisionTreeRegressor.
0

использование sklearn.tree.DecisionTreeRegressor()