Valueerror: «метрики не могут обрабатывать сочетание двоичных и непрерывных целей» без источника.

Я новичок в машинном обучении и пытаюсь научиться, работая над проблемой Титаника Kaggle. Насколько мне известно, я убедился, что показатели синхронизированы друг с другом, но, конечно, я виню в этой проблеме себя, а не Python. Однако я все еще не мог найти исходный код, и Spyder IDE мне не помог.

Это мой код:

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

"""Assigning the train & test datasets' adresses to variables"""
train_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\train.csv"
test_path = "C:\\Users\\Omar\\Downloads\\Titanic Data\\test.csv"

"""Using pandas' read_csv() function to read the datasets
and then assigning them to their own variables"""
train_data = pd.read_csv(train_path)
test_data = pd.read_csv(test_path)

"""Using pandas' factorize() function to represent genders (male/female)
with binary values (0/1)"""
train_data['Sex'] = pd.factorize(train_data.Sex)[0]
test_data['Sex'] = pd.factorize(test_data.Sex)[0]

"""Replacing missing values in the training and test dataset with 0"""
train_data.fillna(0.0, inplace = True)
test_data.fillna(0.0, inplace = True)

"""Selecting features for training"""
columns_of_interest = ['Pclass', 'Sex', 'Age']

"""Dropping missing/NaN values from the training dataset"""
filtered_titanic_data = train_data.dropna(axis=0)

"""Using the predictory features in the data to handle the x axis"""
x = filtered_titanic_data[columns_of_interest]

"""The survival (what we're trying to find) is the y axis"""
y = filtered_titanic_data.Survived

"""Splitting the train data with test"""
train_x, val_x, train_y, val_y = train_test_split(x, y, random_state=0)

"""Assigning the DecisionTreeRegressor model to a variable"""
titanic_model = DecisionTreeRegressor()

"""Fitting the x and y values with the model"""
titanic_model.fit(train_x, train_y)

"""Predicting the x-axis"""
val_predictions = titanic_model.predict(val_x)

"""Assigning the feature columns from the test to a variable"""
test_x = test_data[columns_of_interest]

"""Predicting the test by feeding its x axis into the model"""
test_predictions = titanic_model.predict(test_x)

"""Printing the prediction"""
print(val_predictions)

"""Checking for the accuracy"""
print(accuracy_score(val_y, val_predictions))

"""Printing the test prediction"""
print(test_predictions)

и это трассировка стека:

Traceback (most recent call last):

  File "<ipython-input-3-73797c87986e>", line 1, in <module>
    runfile('C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py', wdir='C:/Users/Omar/Downloads/Kaggle Competition')

  File "C:\Users\Omar\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\Omar\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py", line 58, in <module>
    print(accuracy_score(val_y, val_predictions))

  File "C:\Users\Omar\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 176, in accuracy_score
    y_type, y_true, y_pred = _check_targets(y_true, y_pred)

  File "C:\Users\Omar\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 81, in _check_targets
    "and {1} targets".format(type_true, type_pred))

ValueError: Classification metrics can't handle a mix of binary and continuous targets

Поскольку данные Титаника легко доступны, это хорошая возможность сделать ваш код полностью воспроизводимый; так что в следующий раз будет хорошей практикой сделать это, явно включив ваш (соответствующий) импорт (вместо import ...) ...

desertnaut 13.09.2018 18:47

Спасибо. Я добавил импорт.

oo92 13.09.2018 18:50

Пожалуйста, не редактируйте сообщение, чтобы включить средство и новый результат без ошибки! Предполагается, что он останется таким, как есть, для возможной помощи другим в будущем (отредактировал его сам)!

desertnaut 13.09.2018 19:03
0
3
5 205
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы используете DecisionTreeRegressor, который, как говорится, является регрессорной моделью. Проблема Kaggle Titanic - это проблема классификации. Поэтому вам следует использовать DecisionTreeClassifier.

Что касается того, почему ваш код выдает ошибку, это потому, что val_y имеет двоичные значения (0,1), тогда как val_predictions имеет непрерывные значения, потому что вы использовали модель регрессора.

Ответ принят как подходящий

Вы пытаетесь использовать алгоритм регрессии (DecisionTreeRegressor) для решения задачи двоичной классификации; модель регрессии, как и ожидалось, дает непрерывные выходные данные, но accuracy_score, где действительно происходит ошибка:

File "C:/Users/Omar/Downloads/Kaggle Competition/Titanic.py", line 58, in <module>
    print(accuracy_score(val_y, val_predictions)) 

ожидает двоичных единиц, отсюда и ошибка.

Для начала смените модель на

from sklearn.tree import DecisionTreeClassifier

titanic_model = DecisionTreeClassifier()

Для классификации нужна дискретная метка, поскольку она предсказывает класс (который представляет собой любую метку), а регрессия работает с непрерывными данными. Поскольку ваш вывод - это метка класса, вам необходимо выполнить классификацию

Другие вопросы по теме