逻辑回归预测错误

Posted

技术标签:

【中文标题】逻辑回归预测错误【英文标题】:Logistic Regression prediction faults 【发布时间】:2019-03-05 08:08:35 【问题描述】:

我一直在尝试解决这个泰坦尼克号幸存者的问题。我将 x 拆分为乘客,将 y 拆分为幸存者。但问题是我无法获得 y_pred (ie) 预测结果。因为所有值都是 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 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]

不过,在您的方法中,我注意到了一些您可能想知道的事情:

    Pandas read_csv 中的默认分隔符是 ,,因此如果您的数据集变量由 tab 分隔(与我的相同),那么您应该像这样指定分隔符:

    df = pd.read_csv('titanic.csv', sep='\t')
    

    PassengerId 没有任何有用的信息可供您的模型学习以预测 Survived 人,它只是一个随着每个新乘客而增加的连续数字。一般来说,在分类中,您需要利用使您的模型从中学习的所有特征(当然,除非有冗余特征不会向模型添加任何信息),尤其是在您的数据集中,它是一个多变量的数据集。

    没有必要对PassengerId 进行缩放,因为features scaling 通常在特征的大小、单位和范围(例如 5 公斤和 5000 克)和您的如前所述,它只是一个增量整数,对模型没有真实信息。

    最后一件事,您应该将您的数据作为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没有为模型提供有用的信息,所以它无法预测正确!)

您可以通过比较 log loss 在从数据集中添加更多功能之前和之后自行测试:

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]

结论:

如您所见,损失提供了更好的价值(比以前更小)并且预测现在更合理!

【讨论】:

您好,感谢您的回答。我仍然得到与我的预测相同的零。所以这是一个数据集链接,以便您可以分享您的结果kaggle.com/c/titanic/data @UmerSalman 我更新了我的答案,如果对你有帮助,请接受。 @Yahya 这对初学者来说真的很有帮助。 :) 谢谢。

以上是关于逻辑回归预测错误的主要内容,如果未能解决你的问题,请参考以下文章

在逻辑回归中预测具有最高可能概率的某个标签

线性回归逻辑回归

机器学习笔记-基于逻辑回归的分类预测

机器学习:基于逻辑回归对某银行客户违约预测分析

使用逻辑回归预测用户是否会购买SUV

Python中的多元逻辑回归显示错误