🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.背景及意义
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.3.1分析目标变量数量分布情况
4.3.2分析男女比例情况
4.3.3分析年龄分布情况
4.3.4分析不同年龄和性别对于收入的影响
4.3.5分析不同种族的分布情况
4.3.6分析不同职业的数量情况
4.4特征工程
4.5模型构建
4.6特征重要性
4.7模型预测
5.实验总结
源代码
1.背景及意义
居民收入预测分类研究是一种基于数据分析和机器学习算法的研究,旨在根据个人或家庭的背景信息和经济指标,预测其未来的收入水平。这种研究对于金融机构、政府部门和企业等具有重要的实际应用价值。
首先,居民收入是社会经济发展的重要指标之一,对于政府决策和宏观经济调控具有重要意义。通过收入预测分类研究,政府可以更加准确地了解不同人群的收入状况,有针对性地实施相应政策,促进经济发展和社会稳定。
其次,金融机构和企业也需要了解客户的收入水平,以便更好地为客户提供金融服务和产品。通过居民收入预测分类研究,金融机构和企业可以更好地了解客户的经济状况,制定更加个性化的金融方案和产品,提高客户满意度和企业盈利能力。
此外,居民收入预测分类研究还有助于提高社会公平性和经济包容性。通过分析不同人群的收入水平和影响因素,政府和社会组织可以更好地了解不同人群的经济状况,有针对性地制定扶贫政策和社会福利计划,实现社会公平和经济包容。
综上所述,居民收入预测分类研究对于政府、金融机构、企业和社会组织等都具有重要的实际应用价值,有助于推动社会经济发展和提高社会公平性和经济包容性。
2.项目简介
2.1项目说明
本项目通过分析加州大学机器学习存储库中的收入分类数据集,找出影响收入的主要因素,最后使用机器学习算法构建收入分类预测模型。本项目是一个二分类问题。
2.2数据说明
本数据集来源于kaggle,原始数据集共有32561条数据,15列特征变量,具体变量说明如下:
- age: continuous.
- workclass: Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked.
- fnlwgt: continuous.
- education: Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool.
- education-num: continuous.
- marital-status: Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse.
- occupation: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces.
- relationship: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried.
- race: White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black.
- sex: Female, Male.
- capital-gain: continuous.
- capital-loss: continuous.
- hours-per-week: continuous.
- native-country: United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam, Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands.
2.3技术工具
Python版本:3.10
代码编辑器:jupyter notebook
3.算法原理
XGBoost(Extreme Gradient Boosting)是一种基于决策树集成的机器学习算法,它使用梯度提升方法(Gradient Boosting)来训练决策树。XGBoost的主要优点是速度快,准确性高,可扩展性好,因此在机器学习和数据科学领域中非常流行。
下面是XGBoost的算法原理:
1.损失函数:
XGBoost的目标是最小化损失函数,其中损失函数由两个部分组成:正则化项和目标函数。正则化项用于防止过拟合,目标函数用于衡量模型预测结果与实际结果之间的误差。常见的目标函数包括平方误差损失函数、Logistic损失函数等。
2.决策树:
XGBoost使用决策树作为基本模型,而不是使用传统的线性模型。决策树由节点和叶子节点组成,每个节点表示一个特征,每个叶子节点表示一个类别或一个实数值。决策树是通过递归地将数据集分割为越来越小的子集来构建的。
3.梯度提升:
XGBoost使用梯度提升方法训练决策树模型。梯度提升是一种迭代的方法,每次迭代都训练一个新的决策树模型,它的预测结果与前面所有模型的预测结果相加得到最终的预测结果。在每一次迭代中,XGBoost计算残差的梯度,并用残差更新目标函数。然后,XGBoost使用这个更新后的目标函数训练一个新的决策树模型。
4.正则化:
XGBoost通过正则化方法防止过拟合。常用的正则化方法包括L1正则化和L2正则化。L1正则化可以使得一些决策树的权重为0,从而剪枝一些不必要的决策树。L2正则化可以使得决策树的权重变得更加平滑,从而提高模型的泛化能力。
5.优化算法:
XGBoost使用了一些优化算法来提高训练速度和准确性。其中最重要的优化算法是加权梯度下降算法(Weighted Gradient Descent)。加权梯度下降算法可以根据损失函数的梯度和二阶导数来自适应地调整学习率,从而提高模型的准确性。
XGBoost算法的具体步骤如下:
-
初始化模型。设定迭代次数,学习率和决策树的深度等超参数。
-
对于每一次迭代:
a. 计算负梯度。根据当前模型在训练数据上的表现,计算每个样本的负梯度,用于构建下一棵决策树。
b. 构建决策树。根据负梯度的大小,构建一棵新的决策树。
c. 计算叶子节点权重。对于每个叶子节点,计算它的权重,以最小化损失函数。
d. 更新模型。将新的决策树加入模型,并根据学习率更新模型参数。
-
返回最终的模型。
XGBoost的优点在于它的泛化能力强,可以处理高维度、稀疏数据,并且有很好的防止过拟合的机制。同时,它的速度也非常快,可以处理大规模的数据集。因此,XGBoost已经成为了机器学习领域中应用最广泛的算法之一。
4.项目实施步骤
4.1理解数据
首先使用pandas导入收入分类数据集并查看前五行
查看数据大小
可以发现数据共有32561行,15列
查看数据基本信息
从结果中我们可以看出各变量的数据类型以及空值情况。
查看数值型描述性统计
从结果中可看出各个数值型变量的均值、方差、最大最小值、四分位数等信息。
查看非数值型数据描述性统计
4.2数据预处理
首先统计一下各特征的缺失值情况
通过结果发现各特征都不存在缺失值,故不需要处理
统计一下数据集中的重复值个数
通过结果我们发现数据集中共有24个重复数据,需要进行处理。这里我们直接删除即可。
通过肉眼发现,原始数据集中虽然没有空值,但是有很多“?”,所以这里我们需要对其进行处理。原理是遍历所有数据,如果发现值为‘?’则将其设为空值,否则直接返回值本身。
经过前面的处理后,我们发现异常的数据主要集中在workclass、occupation和native-country这三列,由于数据量不大,我们直接删除即可。
4.3探索性数据分析
首先导入可视化用到的第三方库
4.3.1分析目标变量数量分布情况
通过结果我们发现,原始数据集中<=50k的数据显著多于>50k的,说明整体上收入少的人数还是占多数,也符合实际。
4.3.2分析男女比例情况
从结果中我们发现数据集中男性占据多数为67.57%,女性只有32.43%。
4.3.3分析年龄分布情况
从结果来看,年龄主要集中在20-50岁之间,60岁以上还是占据不少
4.3.4分析不同年龄和性别对于收入的影响
从结果中我们发现,在<=50k的群体中,女性的年龄平均大于男性,而在>50k的群体中,男性的年龄平均大于女性。<=50k的群体年龄普遍集中30多岁,而>50k的群体年龄普遍集中在40多岁。
4.3.5分析不同种族的分布情况
从结果看出,该数据集中绝大多数为白人,其次是黑人,其他种族占比较少。
4.3.6分析不同职业的数量情况
4.4特征工程
首先处理收入变量,将<=50k用0表示,>50k用1表示。其次是性别,用0表示女性,1表示男性。
但是这样处理的话效率较低,所以我们直接使用LabelEncoder进行编码
接着准备数据,及目标变量和特征变量,然后拆分数据集为训练集和测试集,其中测试集比例为0.2。
4.5模型构建
首先构建逻辑回归模型,并输出模型的各项评估指标
从模型准确率和ROC曲线看出,逻辑回归模型效果较差。
构建决策树模型
决策树的整体指标优于逻辑回归,但是效果还是不够好。
构建随机森林模型
随机森林模型的各项指标明显高于前面两种模型,我们看看还有没有更好的模型。
构建XGBoost模型
可以看出XGBoost模型的各项指标略微高于随机森林,所以我们最终选取XGBoost模型作为本次实验的最终的算法模型。
4.6特征重要性
接下来我们使用前面的XGBoost来打印特征重要性并可视化
从结果我们看出relationship关系最收入影响最大。
4.7模型预测
我们将前面模型预测的结果进行汇总并随机抽取10个来检测一下:
从结果我们发现,随机抽取10个,预测正确的个数为9个,模型效果还不错。
5.实验总结
本次实验我们分析了美国加州地区的收入数据集,我们发现该地区主要以白人、男性、收入<=50k,年龄处于20-50的群体为主,最后构建的收入分类模型准确率为0.87,模型效果还不错,还有待提高。
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
源代码
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv('income_evaluation.csv') # 加载数据集
data.head() # 查看数据前五行
data.shape # 查看数据大小
data.info() # 查看数据基本信息
data.describe() # 查看数值型数据的描述性统计
data.describe(include='O') # 查看非数值型数据的描述性统计
数据预处理
data.isnull().sum() # 统计各特征的缺失值情况
data.duplicated().sum() # 统计数据集中的重复值个数
data.drop_duplicates(inplace=True) # 删除重复值
print(data.shape)
data.duplicated().sum()
# 异常值处理
def disploy_character(x):
if x == ' ?':
return None
else:
return x
for col in data.columns.to_list():
data[col] = data[col].apply(disploy_character)
data.isnull().sum()
data.dropna(inplace=True) # 删除缺失值
data.shape
数据可视化
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font='SimHei')
# 查看目标变量的数量分布情况
sns.countplot(data=data,x='income')
plt.show()
# 分析男女比例情况
y = data['sex'].value_counts().values.tolist()
labels = data['sex'].value_counts().index.to_list()
plt.pie(y,labels=labels, # 设置饼图标签
autopct='%.2f%%', # 格式化输出百分比
)
plt.show()
# 分析年龄分布情况
sns.histplot(data=data,x='age',kde=True)
plt.show()
# 分析不同年龄和性别对于收入的影响
sns.boxenplot(data=data,x='income',y='age',hue='sex')
plt.show()
# 分析不同种族的数量
data['race'].value_counts().plot(kind='bar')
plt.show()
# 分析不同职业的数量
data['occupation'].value_counts().plot(kind='barh')
plt.show()
特征工程
# 处理收入特征,用0和1表示
data['income'].replace(to_replace={' <=50K':0,' >50K':1},inplace=True)
# 处理性别特征,用0和1表示
data['sex'].replace(to_replace={' Female':0,' Male':1},inplace=True)
from sklearn.preprocessing import LabelEncoder
for col in data.describe(include='O').columns.to_list():
data[col] = LabelEncoder().fit_transform(data[col])
data.head()
# 准确数据
X = data.drop('income',axis=1)
y = data['income']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
# from sklearn.model_selection import train_test_split
构建模型
# 构建逻辑回归模型
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
from sklearn.linear_model import LogisticRegression
lg = LogisticRegression()
lg.fit(X_train,y_train)
# 模型评估
y_pred = lg.predict(X_test)
print('模型准确率:',accuracy_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = lg.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 构建决策树模型
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
# 模型评估
y_pred = tree.predict(X_test)
print('模型准确率:',accuracy_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = tree.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 构建随机森林模型
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier()
forest.fit(X_train,y_train)
# 模型评估
y_pred = forest.predict(X_test)
print('模型准确率:',accuracy_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = forest.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 构建GBDT梯度提升决策树模型
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier()
gbdt.fit(X_train,y_train)
# 模型评估
y_pred = gbdt.predict(X_test)
print('模型准确率:',accuracy_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = gbdt.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 构建XGBoost模型
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
# 模型评估
y_pred = xgb.predict(X_test)
print('模型准确率:',accuracy_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = xgb.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
#打印特征重要性评分
import numpy as np
feat_labels = X_train.columns[0:]
importances = xgb.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
index_list.append(feat_labels[j])
value_list.append(importances[j])
print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('Feature Importance Sorted',fontsize=14)
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)