为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。
目录
逻辑回归算法介绍
练习题
Python代码与分析
1、读入数据,观察数据情况
2、各属性与生还情况的关联
3、数据预处理(关键步骤)
4、划分训练集和测试集,即预留一部分数据(30%),用于评价模型
5、模型构建及训练
6、预测测试数据
7、绘制混淆矩阵和分类报告
8、绘制ROC曲线,并计算AUC,评估模型性能
逻辑回归算法介绍
逻辑回归算法,虽然名称中含有“回归”二字,却是用来解决分类问题的。
回归与分类的区别在于:回归预测的目标变量的取值是连续的(例如房屋的价格),可以用一条直线拟合,例如一元或多元线性回归模型;分类所预测的目标变量是类别型变量,取值是离散的,例如判断邮件是否为垃圾邮件、判断鸢尾花的类型等。
线性回归和逻辑回归的相同点包括:
(1)线性回归和逻辑回归都是有监督学习算法。
(2)线性回归和逻辑回归的损失函数、正则化的数学原理与形式基本类似。
线性回归和逻辑回归的不同点包括:
(1)线性回归用于解决回归问题,逻辑回归用于解决分类问题。
(2)线性回归要求目标变量是连续数值型,逻辑回归要求是离散型。
(3)线性回归要求特征与目标变量呈线性关系,逻辑回归不要求特征与目标变量是线性关系。
练习题
泰坦尼克号乘客生还的预测是数据科学竞赛平台Kaegle上最经典的人门竞赛之一。它是一个二分类问题,要求根据乘客的相关信息,如性别、年龄、船舱等级等来预测其是否会生还。本期,我们使用逻辑回归来建模泰坦尼克号乘客生还的预测问题。
Python代码与分析
1、读入数据,观察数据情况
import pandas as pd
data = pd.read_csv('train.csv')
data.info()
由上图可知,训练集中共有891行和12项。这12项的具体含义如下标所示。
有些项有缺失值。Age(年龄)有714人有记录,缺失177人的记录;Cabin(舱位)有204人有记录,缺失687人的记录;Embarked(登船港口)有889人有记录,缺失2人的记录。
是可以用下列语句进行数据的描述统计分析。
data.describe()
可以看到,乘客的平均年龄为29.7,最大年龄为80.0,最小年龄为0.42。生还人数大约为总体的38%,票价最贵的为512.33美元等。
2、各属性与生还情况的关联
此数据集有 10个属性,我们主要拿出性别和登船港口两个属性分析生还率,其余属性分析类似。
(1)不同性别的生还情况
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Heiti TC']
plt.rcParams['axes.unicode_minus'] = False# 所有获救的人中,性别为‘male’的数量
Survived_m = data.Survived[data.Sex == 'male'].value_counts()
# 所有获救的人中,性别为‘female’的数量
Survived_f = data.Survived[data.Sex == 'female'].value_counts()
df = pd.DataFrame({'男性': Survived_m, '女性':Survived_f})
df.plot(kind = 'bar', stacked = True)
plt.title('按性别看是否生还')
plt.xlabel('生还')
plt.ylabel('人数')
plt.show()
0代表未生还,1代表生还。明显可以看出,未生还人员中男性乘客比例较大,而生还人员中女性乘客比例较大。所以很大程度上可以确定性别是预测生还情况的一个重要因素。
(2)不同登船港口乘客的生还情况。
Survived_0 = data.Embarked[data.Survived == 0].value_counts()
Survived_1 = data.Embarked[data.Survived == 1].value_counts()
df = pd.DataFrame({'生还': Survived_1, '未生还': Survived_0})
df.plot(kind = 'bar', stacked = True)
plt.title('各登船港口乘客是否生还')
plt.xlabel('登船港口')
plt.ylabel('人数')
plt.show()
我们把生还人数占各个港口登船中人数的比例看成分析条件,总的来说C港口的生还率高一些,S港口的生还率相对低一些。
3、数据预处理(关键步骤)
数据预处理包括无关特征的删除、填充缺失值、编码转换、数据缩放等。
# 删除姓名、ID、船票编号、客舱号等无关信息,axis=0删除行,axis=1删除列。
data.drop(['Name', 'PassengerId', 'Ticket', 'Cabin'], axis = 1, inplace = True)
# 用平均值或众数填充缺失数据
data['Age'] = data['Age'].fillna(data['Age'].mean())
data['Fare'] = data['Fare'].fillna(data['Fare'].mean())
data['Embarked'] = data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
# 将性别与登船港口进行独热编码
dumm = pd.get_dummies(data[['Sex', 'Embarked']], drop_first = True)
data = pd.concat([data, dumm], axis = 1)
data.drop(['Sex', 'Embarked'], axis = 1, inplace = True)
# 数据缩放(数据标准化-无量纲化)
data['Age'] = (data['Age'] - data['Age'].min()) / (data['Age'].max() - data['Age'].min())
data['Fare'] = (data['Fare'] - data['Fare'].min()) / (data['Fare'].max() - data['Fare'].min())
4、划分训练集和测试集,即预留一部分数据(30%),用于评价模型
from sklearn.model_selection import train_test_split
X = data.drop('Survived', axis = 1)
y = data.Survived
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
5、模型构建及训练
(1)创建模型
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
(2)训练模型
LR.fit(X_train, y_train)
print('训练集准确率:\n', LR.score(X_train, y_train))
print('测试集准确率:\n', LR.score(X_test, y_test))
训练集准确率:0.797752808988764 测试集准确率:0.8171641791044776
可以看到,该模型在测试集上的准确率高于训练集上的准确率,没有过拟合,可以考虑增加模型参数或复杂度。
6、预测测试数据
y_pred = LR.predict(X_test)
7、绘制混淆矩阵和分类报告
Scikit-learn中的metrics模块中提供了有关各种评价指标的计算函数,包括混淆矩阵(confusion_matrix)和分类报告(classification_report)等。
from sklearn import metrics
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
从上面的混淆矩阵可以看出,真正例的个数是74,真负例的个数是145。
从分类报告中得到,模型在类别0上的预测表现较好,具有较高的精确度、召回率和F1分数。 模型在类别1上的召回率稍低,但精确度和F1分数仍然不错。 总体而言,模型的准确度为82%,表明其在大多数情况下能够正确分类样本。
8、绘制ROC曲线,并计算AUC,评估模型性能
绘制ROC曲线需要分类器输出预测每个样例属于正例的概率值。
y_pred_prob = LR.predict_proba(X_test)
计算ROC曲线,即真正例率、假正例率、分类阈值等。
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred_prob[:,1])
计算AUC值。
auc = metrics.auc(fpr, tpr)
print(auc)
0.8551536116322701
绘制ROC曲线
plt.plot(fpr, tpr, lw = 2, label = 'ROC曲线(area = {:.2f})'.format(auc))
plt.plot([0,1],[0,1],'r--')
plt.xlabel('假正例率') # False Positive Rate
plt.ylabel('真正例率') # True Positive Rate
plt.title('ROC曲线示例') # Receiver operating characteristic example
plt.legend(loc = 'lower right')
plt.show()
ROC曲线是评估二分类模型性能的一个常用工具。
曲线从左下角(0,0)开始,向右上方延伸,最终接近右上角(1,1)。曲线下方的面积越大,模型的性能越好。
理想情况下,曲线应该尽可能地靠近图表的左上角,这意味着模型具有高真正例率(TPR)和低假正例率(FPR)。
图中标注了"ROC曲线(area=0.86)",这表示该ROC曲线下方的面积是0.86。这个面积,也称为AUC(Area Under the Curve),是一个介于0到1之间的数值,用来衡量模型的整体性能。AUC值越高,模型的分类能力越好。在这个例子中,0.86是一个相对较高的AUC值,表明模型具有较好的性能。
横轴(X轴)表示假正例率(False Positive Rate, FPR),即错误地将负类(negative class)判定为正类(positive class)的比例。 纵轴(Y轴)表示真正例率(True Positive Rate, TPR),也称为召回率(Recall),即正确地将正类判定为正类的比例。
诊断线:图中还有一条从左下角到右上角的对角线,这条线代表了没有分类能力的随机猜测模型的ROC曲线。如果一个模型的ROC曲线位于这条线以下,那么它的性能不如随机猜测。
曲线特性:曲线的弯曲程度可以提供关于分类器性能的额外信息。一个平滑且接近右上角的曲线通常表示模型具有较好的区分能力。
总结来说,图片中的ROC曲线示例展示了一个具有较高AUC值的分类器的性能,表明该模型在区分正负类方面表现良好。
都读到这里了,不妨关注、点赞一下吧!