ValueError: «метрики не могут обрабатывать смесь двоичных и непрерывных целей» без источника - PullRequest
0 голосов
/ 13 сентября 2018

Я новичок в машинном обучении и пытаюсь учиться, работая над проблемой Титаника в 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

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вы пытаетесь использовать алгоритм регрессии (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()
0 голосов
/ 14 сентября 2018

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

0 голосов
/ 13 сентября 2018

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

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

...