以下是重构后的内容:
全文链接:https://tecdat.cn/?p=37115
原文出处:拓端数据部落公众号
分析师:Yimeng Li
近几年,伴随着互联网的发展,在线食品配送业务成为了新潮流。在此背景下,我们帮助客户对“在线食品交付偏好-班加罗尔地区”数据开展研究,建立印度在线食品配送平台消费者的用户画像,研究影响顾客购买意愿的因素,并给出相应的预测。本文结合一个Python预测不平衡破产数据实例的代码数据,为读者提供一套完整的实践数据分析流程。
解决方案任务/目标:建立印度班加罗尔地区在线食品配送平台消费者的用户画像,研究影响顾客购买意愿的因素。
数据源准备:
数据集中包含一个完整的调研问卷和相应的用户反馈结果。问卷共计有效填写量338条,包含55项与订购用户相关的调研内容。问卷的发放方式为简单随机抽样(simple random),即随机选取到店和在线下单的用户并邀请填写问卷内容。
特征转换:
由于数据集是问卷的形式,因而在数据预处理阶段将部分描述程度的变量转化为了整数,我们根据用户的意愿按程度进行给分:Strongly agree (Very important): 2Agree (Important): 1Neutral (Moderately important): 0Disagree (Slightly important): -1Strongly disagree (Unimportant): -2
数据集的(部分)变量如下:Output: 用户是否愿意再次线上下单(作为本数据集的因变量)Age: 用户的年龄Monthly income: 用户月薪的等级Ease and convenience: 线上下单的便捷程度Late delivery: 较慢的配送对不再购买的影响程度Politeness: 送餐骑手的礼貌程度Temperature: 食品温度的重要程度
划分训练集和测试集:
为了验证模型的优劣,将数据集分为两部分,70%的数据作为训练集,30%的数据作为测试集。
模型的目标是对output(用户是否愿意再次线上下单)进行预测,并对研究各变量对output的影响。
由于原数据集有55个自变量,为了让模型有更好的解释性,我们利用逻辑回归和AIC准则初步筛选得到9个自变量。如下所示:AgeEase.and.convenientLate deliveryPolitenessTemperatureOutputTotal features9Variables64453242311121000000000
以下是具体的代码实现:
```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from scipy import stats
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from scipy import stats
import numpy as np
# 读取数据
data = pd.read_csv('online_food_delivery_data.csv')
# 特征工程
data['Output'] = data['Output'].map({'strongly agree': 2, 'agree': 1, 'neutral': 0, 'disagree': -1, 'strongly disagree': -2})
data['Age'] = data['Age'].astype('category').cat.codes
data['Monthly income'] = data['Monthly income'].astype('category').cat.codes
data['Ease and convenience'] = data['Ease and convenience'].astype('category').cat.codes
data['Late delivery'] = data['Late delivery'].astype('category').cat.codes * 2 + 1
data['Politeness'] = data['Politeness'].astype('category').cat.codes * 2 + 1
data['Temperature'] = data['Temperature'].astype('category').cat.codes * 2 + 1
data.drop(['Age', 'Monthly income', 'Ease and convenience', 'Late delivery', 'Politeness', 'Temperature'], axis=1, inplace=True)
data.columns = ['Age', 'Ease_and_convenience', 'Late_delivery', 'Politeness', 'Temperature', 'Output']
X = data.iloc[:, 1:]
y = data['Output']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 建立模型并预测
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
```
Time.saving
Late.Delivery
Unaffordable
Politeness
Freshness
Temperature
根据这九个自变量重新尝试搭建模型,得到的预测准确率为88%,AUC为94%。由于数据集中因变量output为0和1的数据量有较大差异,为1:3,为了保证样本的平衡性,引入smote采样法。经过采样,得到了数据量更大且具有较好平衡性的样本。通过此方法重新进行逻辑回归,模型的AUC从94%提升至97%,模型的表现得到了提升。除了基于Smote采样的逻辑回归以外,在模型的探索过程中还引入了决策树、朴素贝叶斯以及加入交叉项等方法,得到的结果如下所示。综上,我们可以发现,就测试集合的准确率而言,C5.0决策树的准确率最高,为92.31%,其次是朴素贝叶斯模型,准确率为91.45%;然而,由于他们不是线性模型,这两者模型不具有可观的解释性。特别的,通过之前的描述性统计与常识可以知道,年龄分布是类似正态的,因此有必要考虑年龄的二次项使得模型更加有效,而上表也进一步证实了引入年龄二次项使得模型的精度有较为显著的提高。值得注意的是,在具体选择模型的时候,需要结合具体所研究的数据特征进行选择模型;例如,没有smote采样的模型由于训练的样本不平衡,在测试集上的准确率较高但是在训练集上的AUC较少,容易发生误判。对于未知Output的分布未知的数据,则Smote的采样显得必要了。SMOTE逻辑回归、SVM、随机森林、AdaBoost和XGBoost分析严重不平衡的破产数据本文旨在探讨如何有效处理并分析严重不平衡的破产数据,采用XGBoost模型作为主要分析工具。数据集包含实体的多种特征和财务比率,目标变量为公司未来几年是否破产(1表示破产,0表示未破产)。通过一系列预处理步骤,包括缺失值处理、多重共线性检查、异常值分析以及通过K-means聚类探索数据分布,本文最终实现了对不平衡数据的有效重采样,并评估了多种机器学习模型在破产预测任务上的性能。
数据预处理数据导入与探索
首先,使用pandas库导入数据集,并设置实体ID为索引:
以下是重构的代码:
```python
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as msno
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from imblearn.over_sampling import SMOTE
import xgboost as xgb
df = pd.read_csv('train.csv')
df.set_index('ID', inplace=True)
df.head()
# 数据不平衡性处理
# 初步分析表明数据存在严重的不平衡性,这是破产预测任务中常见的挑战。不平衡性可能源于罕见但影响重大的事件发生。
# 缺失值处理
# 对于数据中的缺失值,采用适当的插补策略以确保数据完整性。通过可视化缺失值矩阵,可以直观地了解缺失值的分布情况。
plt.figure(figsize=(16, 6))
msno.matrix(df, labels=True, color=(0.20, 0.15, 0.45))
# 多重共线性检查
# 通过绘制热图检查特征之间的多重共线性问题,以避免模型训练过程中的信息冗余和过拟合风险。
fig, ax = plt.subplots(figsize=(16, 12))
plt.xticks(rotation=90)
# 异常值处理
# 虽然识别出存在跨越多个标准差的异常值,但鉴于缺乏领域专业知识,未直接删除这些异常值,以避免可能的信息损失。
# 数据探索与聚类分析K-means聚类
# 采用K-means聚类算法探索数据在特征空间中的分布特性,通过肘部法则确定最佳聚类数。结果显示数据多样性较高,可能包含多个潜在的子群体。
# 数据是多种多样的,许多实体分布在特征空间中。因此,我们的数据可能属于 2 个以上的类,因为在聚类 = 2 时,方差似乎有点偏离。数据重采样SMOTE技术针对数据的高度不平衡性,应用SMOTE(Synthetic Minority Over-sampling Technique)技术进行过采样。通过生成少数类(破产)的合成样本,平衡数据集,从而提高模型对少数类的识别能力。X_res, Y_res = sm.fit_sample(X_train, Y_train)
# 模型评估与选择模型应用将逻辑回归、SVM、随机森林、AdaBoost和XGBoost等模型应用于处理后的数据集,评估它们在破产预测任务上的性能。pd.DataFrame(predictors).T性能比较通过多次实验调整SMOTE中的过采样比率,并对比不同模型在召回率上的表现。结果显示,XGBoost模型在0.11214的打击率下取得了最高的召回率,表明其在处理不平衡数据方面的优势。
```
召回率是我们感兴趣的指标之一,它反映了模型在预测正值时的能力。然而,由于数据集存在不平衡现象(例如,正例和负例的数量差异较大),即使使用最先进的方法,也难以获得较高的召回率。因此,本文将重点探讨如何解决这类数据不平衡问题,以提高模型的性能。
首先,我们使用了SMOTE算法对数据进行了过采样处理。SMOTE算法通过生成少数类样本的合成样本来平衡数据集。具体而言,SMOTE算法通过计算每个样本点周围k个最近邻样本点的权重比例,并根据这个比例生成新的合成样本点。通过多次重复上述过程,我们可以得到足够数量的合成样本点,从而缓解数据不平衡问题。
其次,我们尝试了不同的XGBoost参数设置,包括树的最大深度、最小叶子节点样本数等。通过比较这些参数组合的效果,我们最终确定了一些最优参数值,并将其应用于XGBoost模型中进行训练和预测。
最后,我们在一个破产预测任务上测试了所提出的模型性能。实验结果表明,在使用合理的数据预处理方法(如SMOTE算法)和适当的模型参数设置后,XGBoost模型能够有效地处理严重不平衡的数据集,并取得了较高的召回率和准确率。这为其他类似的不平衡分类问题提供了一种可行的解决方案。未来的研究可以进一步探索更多先进的重采样技术和模型优化策略,以提升模型的整体性能。