基于Python的人工智能应用案例系列(1):回归

        在本系列的第一篇文章中,我们将深入探讨回归模型,并通过一个具体的案例——预测全球各国的预期寿命,展示如何运用回归算法解决实际问题。

案例背景

        本案例的数据集涉及多个与健康和社会经济状况相关的特征,目标是预测各个国家在不同年份的预期寿命。数据集的特征包括:

- **国家(Country)**
- **年份(Year)**
- **国家状态(Status)**:国家发展状态(已开发/发展中)
- **预期寿命(Life expectancy)**:预测的目标变量,表示预期寿命
- **成人死亡率(Adult Mortality)**:15至60岁之间的死亡率(每1000人口)
- **婴儿死亡率(Infant deaths)**:每1000人口的婴儿死亡数
- **酒精消费(Alcohol)**:人均酒精消费量
- **健康支出占比(Percentage expenditure)**:健康支出占GDP的比例
- **乙肝免疫覆盖率(Hepatitis B)**:1岁儿童的乙肝免疫覆盖率
- **麻疹病例数(Measles)**:每1000人口的麻疹报告数
- **平均BMI(BMI)**:全体人口的平均体重指数
- **五岁以下儿童死亡率(Under-five deaths)**:每1000人口的五岁以下儿童死亡数
- **GDP**:人均国内生产总值(以美元计)
- **人口(Population)**:国家人口数
- **资源收入构成指数(Income composition of resources)**:人类发展指数(0到1的范围)
- **受教育年限(Schooling)**:平均受教育年限
数据预处理与特征工程

        在建模之前,我们需要对数据进行预处理和特征工程。这一步骤包括加载数据、检查数据的完整性、处理缺失值、重命名列名和进行探索性数据分析(EDA)。

导入必要的库和数据

        首先,我们导入必要的Python库,如pandasnumpyseaborn,然后加载数据进行初步检查。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import warnings

warnings.filterwarnings('ignore')

# 读取数据
df = pd.read_csv('data/Life_Expectancy_Data.csv')
df.head()

        通过查看数据的基本情况和描述性统计信息,确认数据的结构、类型和缺失值情况。

# 查看数据基本情况
print(df.info())
print(df.describe())

重命名列名

        为便于代码编写和理解,我们将一些列名重命名为更短的版本。例如,将"Life expectancy"简化为"life-exp"。

df.rename(columns = {'Country':'country', 
                     'Year':'year', 
                     'Status':'status', 
                     'Life expectancy ':'life-exp', 
                     'Adult Mortality':'adult-mort',
                     'infant deaths':'infant-deaths', 
                     'Alcohol':'alcohol', 
                     'percentage expenditure':'per-exp', 
                     'Hepatitis B':'hepa',
                     'Measles ':'measles', 
                     ' BMI ':'bmi', 
                     'under-five deaths ':'under-five-deaths', 
                     'Polio':'polio', 
                     'Total expenditure':'total-exp',
                     'Diphtheria ':'dip', 
                     ' HIV/AIDS':'hiv', 
                     'GDP':'gdp', 
                     'Population':'pop',
                     ' thinness  1-19 years':'thin1-19', 
                     ' thinness 5-9 years':'thin5-9',
                     'Income composition of resources':'income', 
                     'Schooling':'school'}, inplace=True)

探索性数据分析(EDA)

        通过EDA,我们可以更好地理解数据的分布、特征之间的相关性,并找到与目标变量(预期寿命)高度相关的因素。单变量分析和多变量分析是其中重要的部分。

# 单变量分析 - 查看国家的发达状态分布
sns.countplot(data = df, x = 'status')
plt.show()

# 查看预期寿命的分布
sns.displot(data = df, x = 'life-exp')
plt.show()

# 多变量分析 - 国家状态与预期寿命的关系
sns.boxplot(x = df["status"], y = df["life-exp"])
plt.ylabel("Life Expectancy")
plt.xlabel("Status")
plt.show()

# 收入与预期寿命的散点图
sns.scatterplot(x = df['income'], y = df['life-exp'], hue=df['status'])
plt.show()

# 相关性热力图
plt.figure(figsize=(15,8))
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.show()

标签编码

        将“Developed”(已开发)和“Developing”(发展中)等文本数据转换为数值类型,以便回归模型能够处理这些分类变量。

le = LabelEncoder()
df["status"] = le.fit_transform(df["status"])
数据拆分与预处理

        为了构建和评估模型,我们将数据拆分为训练集和测试集,并对特征进行标准化处理。此外,还要处理缺失值,确保数据完整性。

拆分训练集与测试集

        我们将数据集拆分为训练集和测试集,通常按照7:3的比例进行拆分。

X = df[['income', 'adult-mort']]
y = df["life-exp"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

处理缺失值

        为避免因缺失值影响模型的表现,我们使用中位数填充训练集和测试集中的缺失值。

# 填充缺失值
X_train['income'].fillna(X_train['income'].median(), inplace=True)
X_train['adult-mort'].fillna(X_train['adult-mort'].median(), inplace=True)
X_test['income'].fillna(X_train['income'].median(), inplace=True)
X_test['adult-mort'].fillna(X_train['adult-mort'].median(), inplace=True)
y_train.fillna(y_train.median(), inplace=True)
y_test.fillna(y_train.median(), inplace=True)

标准化处理

        通过标准化,将特征缩放到相同的尺度上,从而使模型训练更加高效。

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
模型构建与训练

        接下来我们将使用线性回归模型进行训练,并评估其性能。

构建线性回归模型

        通过Scikit-Learn的线性回归模型,我们可以预测预期寿命,并通过均方误差(MSE)和R²评分来评估模型的准确性。

lr = LinearRegression()
lr.fit(X_train, y_train)
yhat = lr.predict(X_test)

print("MSE: ", mean_squared_error(y_test, yhat))
print("R²: ", r2_score(y_test, yhat))

交叉验证

        为了避免过拟合,我们使用K折交叉验证(KFold)来评估模型的泛化性能。

from sklearn.model_selection import KFold, cross_val_score

algorithms = [LinearRegression()]
kfold = KFold(n_splits=5, shuffle=True)
scores = cross_val_score(algorithms[0], X_train, y_train, cv=kfold, scoring='neg_mean_squared_error')
print(f"线性回归 - MSE: {scores.mean()}")
模型评估

        模型的好坏可以通过测试集上的均方误差(MSE)和R²评分来判断,MSE越低,R²越接近1,模型的性能越好。

yhat = lr.predict(X_test)
print("测试集 MSE: ", mean_squared_error(y_test, yhat))
print("测试集 R²: ", r2_score(y_test, yhat))
特征重要性分析

        通过分析特征重要性,我们可以了解到哪些特征对模型的预测贡献最大。

plt.barh(['Income', 'Adult Mortality'], lr.coef_)
plt.xlabel('Feature Importance')
plt.show()
模型保存与加载

        最后,将模型保存为文件,便于后续使用或部署。

import pickle

# 保存模型
filename = 'model/life-expectancy.model'
pickle.dump(lr, open(filename, 'wb'))

# 加载模型
loaded_model = pickle.load(open(filename, 'rb'))
结语

        通过本篇文章,我们成功地构建并训练了一个回归模型,预测全球各国的预期寿命。我们展示了从数据预处理、特征选择到模型训练和评估的完整过程,最后还分析了特征的重要性。这个项目不仅展示了回归算法在实际问题中的应用,还为未来的AI项目开发提供了很好的参考。

        期待您继续关注本系列的后续文章!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会飞的Anthony

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

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

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

打赏作者

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

抵扣说明:

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

余额充值