【深耕 Python】Data Science with Python 数据科学(16)Scikit-learn机器学习(一)

写在前面

关于数据科学环境的建立,可以参考我的博客:

【深耕 Python】Data Science with Python 数据科学(1)环境搭建

往期数据科学博文:

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

【深耕 Python】Data Science with Python 数据科学(3)Numpy 常量、函数和线性空间

【深耕 Python】Data Science with Python 数据科学(4)(书337页)练习题及解答

【深耕 Python】Data Science with Python 数据科学(5)Matplotlib可视化(1)

【深耕 Python】Data Science with Python 数据科学(6)Matplotlib可视化(2)

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

【深耕 Python】Data Science with Python 数据科学(8)pandas数据结构:Series和DataFrame

【深耕 Python】Data Science with Python 数据科学(9)书361页练习题

【深耕 Python】Data Science with Python 数据科学(10)pandas 数据处理(一)

【深耕 Python】Data Science with Python 数据科学(11)pandas 数据处理(二)

【深耕 Python】Data Science with Python 数据科学(12)pandas 数据处理(三)

【深耕 Python】Data Science with Python 数据科学(13)pandas 数据处理(四):书377页练习题

【深耕 Python】Data Science with Python 数据科学(14)pandas 数据处理(五):泰坦尼克号亡魂 Perished Souls on “RMS Titanic”

【深耕 Python】Data Science with Python 数据科学(15)pandas 数据处理(六):书385页练习题

代码说明: 由于实机运行的原因,可能省略了某些导入(import)语句。

本期,使用Scikit-learn机器学习库对第14期泰坦尼克号乘客数据进行回归分析。

一、读取数据表格

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

URL = "https://learnenough.s3.amazonaws.com/titanic.csv"
titanic = pd.read_csv(URL)

二、绘制散点图

通过绘制散点图,分析乘客年龄和生还率的关系。

首先,从表格中提取“年龄”列和“生还”列:

passenger_age = titanic[["Age", "Survived"]].dropna()  # 去除NaN值
print(passenger_age.head())

程序输出:

#   年龄     是否生还
    Age     Survived
0  22.0         0  # 未生还
1  38.0         1  # 生还
2  26.0         1
3  35.0         1
4  35.0         0

提取乘客年龄,并对其进行升序排序:

passenger_ages = passenger_age["Age"].unique()
passenger_ages.sort()
print(passenger_ages)

程序输出:

# 最小年龄:0.42岁;最大年龄:80岁
[ 0.42  0.67  0.75  0.83  0.92  1.    2.    3.    4.    5.    6.    7.
  8.    9.   10.   11.   12.   13.   14.   14.5  15.   16.   17.   18.
 19.   20.   20.5  21.   22.   23.   23.5  24.   24.5  25.   26.   27.
 28.   28.5  29.   30.   30.5  31.   32.   32.5  33.   34.   34.5  35.
 36.   36.5  37.   38.   39.   40.   40.5  41.   42.   43.   44.   45.
 45.5  46.   47.   48.   49.   50.   51.   52.   53.   54.   55.   55.5
 56.   57.   58.   59.   60.   61.   62.   63.   64.   65.   66.   70.
 70.5  71.   74.   80.  ]

计算不同年龄乘客的生还率,并对年龄区间30~40岁乘客的(平均)生还率进行输出:

survival_rate = passenger_age.groupby("Age")["Survived"].mean()
print(survival_rate.loc[30:40])

程序输出:

# 年龄   平均生还率
Age
30.0    0.400000
30.5    0.000000
31.0    0.470588
32.0    0.500000
32.5    0.500000
33.0    0.400000
34.0    0.400000
34.5    0.000000
35.0    0.611111
36.0    0.500000
36.5    0.000000
37.0    0.166667
38.0    0.454545
39.0    0.357143
40.0    0.461538
Name: Survived, dtype: float64

接下来,以年龄作为横坐标,平均生还率作为纵坐标,绘制散点图:

fig, ax = plt.subplots()
ax.scatter(passenger_ages, survival_rate)
plt.title("Scatter Plot of Survival Rate vs Age")
plt.xlabel("Age")
plt.ylabel("Survival Rate")
plt.grid()
plt.show()

程序输出:

在这里插入图片描述

三、使用Scikit-learn对数据进行线性回归分析

首先,准备自变量X和因变量Y:

from sklearn.linear_model import LinearRegression

X = np.array(passenger_ages).reshape((-1, 1))
print(X[:10])
Y = np.array(survival_rate)

程序输出:

# 前10个年龄值
[[0.42]
 [0.67]
 [0.75]
 [0.83]
 [0.92]
 [1.  ]
 [2.  ]
 [3.  ]
 [4.  ]
 [5.  ]]

建立线性回归模型并检视模型参数:

model = LinearRegression()
model.fit(X, Y)
print(model.score(X, Y))
m = model.coef_
b = model.intercept_
print(m)
print(b)

程序输出:

0.13539675574075116  # 模型的R^2值
[-0.00562704]  # 直线的斜率
0.582616045704144  # 直线的y轴截距

接下来,绘制此模型对数据拟合的直线:

fig, ax = plt.subplots()
ax.scatter(passenger_ages, survival_rate)
ax.plot(passenger_ages, m * passenger_ages + b, color="orange")
ax.set_xlabel("Age")
ax.set_ylabel("Survival Rate")
ax.set_title("Titanic survival rates by age")
plt.grid()
plt.show()

程序输出:

在这里插入图片描述

参考文献 Reference

《Learn Enough Python to be Dangerous——Software Development, Flask Web Apps, and Beginning Data Science with Python》, Michael Hartl, Boston, Pearson, 2023.

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不是AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值