基于Python的人工智能应用案例系列(1):回归
通过本篇文章,我们成功地构建并训练了一个回归模型,预测全球各国的预期寿命。我们展示了从数据预处理、特征选择到模型训练和评估的完整过程,最后还分析了特征的重要性。这个项目不仅展示了回归算法在实际问题中的应用,还为未来的AI项目开发提供了很好的参考。期待您继续关注本系列的后续文章!欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
在本系列的第一篇文章中,我们将深入探讨回归模型,并通过一个具体的案例——预测全球各国的预期寿命,展示如何运用回归算法解决实际问题。
案例背景
本案例的数据集涉及多个与健康和社会经济状况相关的特征,目标是预测各个国家在不同年份的预期寿命。数据集的特征包括:
- **国家(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库,如pandas
、numpy
和seaborn
,然后加载数据进行初步检查。
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项目开发提供了很好的参考。
期待您继续关注本系列的后续文章!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!
更多推荐
所有评论(0)