Ошибки прогнозирования логистической регрессии - PullRequest
0 голосов
/ 29 сентября 2018

Я пытался решить эту проблему выжившей титанической проблемы.Где я разделил х, чтобы быть пассажирами, а ты - выжившими.Но проблема в том, что я не смог получить результаты прогноза y_pred (т.е.).Так как это 0 для всех значений.Я получаю 0 значение в качестве прогноза.Было бы полезно для меня, если кто-то может решить это.Как это моя первая проблема классификатора для начинающих

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df = pd.read_csv('C:/Users/Umer/train.csv')
x = df['PassengerId'].values.reshape(-1,1)
y = df['Survived']


from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25, 
random_state = 0)


from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
x_train = sc_x.fit_transform(x_train)
x_test = sc_x.transform(x_test)

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(x_train,y_train)

#predicting the test set results


y_pred = classifier.predict(x_test)

1 Ответ

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

Я не смог воспроизвести тот же результат, на самом деле, я скопировал и вставил ваш код и не получил все нули, как вы описали проблему, вместо этого я получил:

[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0]

Тем не менее,Есть несколько вещей, которые я заметил в вашем подходе, о которых вы, возможно, захотите узнать:

  1. Разделитель по умолчанию в Pandas read_csv равен ,, поэтому, есливаши переменные набора данных разделены tab ( такой же, как у меня ), затем вы должны указать разделитель следующим образом:

    df = pd.read_csv('titanic.csv', sep='\t')
    
  2. PassengerId не имеет полезной информации, из которой ваша модель может извлечь уроки, чтобы предсказать Survived людей, это просто непрерывное число, которое увеличивается с каждым новым пассажиромВообще говоря, в классификации вам необходимо использовать все функции, на которых ваша модель учится (, если, конечно, нет избыточных функций, которые не добавляют информацию к модели ), особенно в вашем наборе данных, это многомерный набор данных.

  3. Нет смысла масштабировать PassengerId, потому что масштабирование объектов обычно используется, когда объекты сильно различаются по величине, единицам измерения и диапазону (например, 5 кг и 5000 г ), а в вашем случае, как я уже говорил, это просто инкрементное целое число, которое не имеет вещественной информации для модели.

  4. OneИ последнее, вы должны получить данные типа float для StandardScaler, чтобы избежать предупреждений, подобных следующим:

    DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.
    

    Таким образом, вы конвертируете так с самого начала:

    x = df['PassengerId'].values.astype(float).reshape(-1,1)
    

Наконец, если вы все еще получаете тот же результат, пожалуйста, добавьте ссылку на ваш набор данных.


Обновление

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

Вы можетепроверьте сами, сравнив потери журнала до и после добавления дополнительных функций из набора данных:

from sklearn.metrics import log_loss
df = pd.read_csv('train.csv', sep=',')
x = df['PassengerId'].values.reshape(-1,1)
y = df['Survived']
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25,
random_state = 0)
classifier = LogisticRegression()
classifier.fit(x_train,y_train)
y_pred_train = classifier.predict(x_train)
# calculate and print the loss function using only the PassengerId
print(log_loss(y_train, y_pred_train))
#predicting the test set results
y_pred = classifier.predict(x_test)
print(y_pred)

Вывод

13.33982681120802
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0]

Сейчасиспользуя много " предположительно полезных " данных:

from sklearn.metrics import log_loss
df = pd.read_csv('train.csv', sep=',')
# denote the words female and male as 0 and 1
df['Sex'].replace(['female','male'], [0,1], inplace=True)
# try three features that you think they are informative to the model
# so it can learn from them
x = df[['Fare', 'Pclass', 'Sex']].values.reshape(-1,3)
y = df['Survived']
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25,
random_state = 0)
classifier = LogisticRegression()
classifier.fit(x_train,y_train)
y_pred_train = classifier.predict(x_train)
# calculate and print the loss function with the above 3 features
print(log_loss(y_train, y_pred_train))
#predicting the test set results
y_pred = classifier.predict(x_test)
print(y_pred)

Вывод

7.238735137632405
[0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0
 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0
 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0
 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1
 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0
 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1
 1]

В заключение:

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

...