mae python实现_使用Python进行机器学习:从0到1,构建回归模型(附完整教程)

本文详细介绍了使用Python进行回归分析的全过程,包括数据预处理、特征工程、模型选择与评估,以房价数据为例。通过分析变量分布、建立线性回归和梯度增强模型,展示如何解释模型预测,以及如何使用LIME工具提升模型可解释性。
摘要由CSDN通过智能技术生成

摘要

在本文中,我将使用数据科学和Python来解释回归用例的主要步骤,从数据分析到理解模型输出。

我将介绍一些非常有用的Python代码,当你遇到相同的情况时,只需要复制,粘贴,运行,就能轻松使用。在每行代码中都添加注释,复制过去就能使用(下面是完整的代码链接)。

https://github.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/blob/master/machine_learning/example_regression.ipynb

本文使用的数据是“房价数据集”,提供多个解释变量,描述住宅的不同方面,我们的任务是预测每套住房的最终价格。

数据集:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

主要步骤包括:环境设置:导入库和读取数据

数据分析:了解变量的含义和预测能力

特征工程:从原始数据中提取特征

预处理:数据分区,处理丢失的值,编码分类变量,缩放

特征选择:只保留最相关的变量

模型设计:基线、训练、验证、测试

绩效评估:阅读指标

可解释性:了解模型如何进行预测

安装程序

首先,我们需要导入以下库。

## 用于数据import pandas as pdimport numpy as np## 用于绘图import matplotlib.pyplot as pltimport seaborn as sns##用于统计检验import scipyimport statsmodels.formula.api as smfimport statsmodels.api as sm##用于机器学习from sklearn import model_selection, preprocessing, feature_selection, ensemble, linear_model, metrics, decomposition## 用于解析器from lime import lime_tabular

接下来我将数据导入pandas数据框。原始数据集包含81列,但在本教程中,我将使用其中的12列子集。dtf = pd.read_csv('data_houses.csv')cols ['OverallQual','GrLivArea','GarageCars', 'GarageArea','TotalBsmtSF','FullBath', 'YearBuilt','YearRemodAdd', 'LotFrontage','MSSubClass']dtf = dtf[['Id'] cols ['SalePrice']]dtf.head()

216360308_1_20210226011905521

关于列的详细信息可以在提供的数据集链接中找到。

表格中的每一行代表一个特定的房子。

一切准备就绪,我将从分析数据开始,然后选择特征,建立机器学习模型并进行预测。

数据分析

在统计学中,探索性数据分析是一个总结数据集主要特征的过程,以了解数据在形式化建模或假设检验任务之外能告诉我们什么。

一般来说,如果我想知道有多少分类变量和数值变量,以及丢失数据的比例,我都会从对数据集的概述开始。有时候会很难识别变量的类型,因为类别可以表示为数字。为此,我编写了一个简单的函数来帮助我们:

'''Recognize whether a column is numerical or categorical.'''def utils_recognize_type(dtf, col, max_cat=20): if (dtf[col].dtype == 'O') | (dtf[col].nunique() < max_cat): return 'cat' else: return 'num'

此函数非常有用,可用于多种场合。为了举例说明,我将绘制数据帧的热图,并可视化列类型和缺少的数据。dic_cols = {col:utils_recognize_type(dtf, col, max_cat=max_cat) for col in dtf.columns}heatmap = dtf.isnull()for k,v in dic_cols.items(): if v == 'num': heatmap[k] = heatmap[k].apply(lambda x: 0.5 if x is False else 1) else: heatmap[k] = heatmap[k].apply(lambda x: 0 if x is False else 1)sns.heatmap(heatmap, cbar=False).set_title('Dataset Overview')plt.show()print('\033[1;37;40m Categerocial ', '\033[1;30;41m Numeric ', '\033[1;30;47m NaN ')

216360308_2_20210226011905662

该数据集中共有1460行和12列数据:

表格的每一行代表一个有ID标识的房屋,因此我将其设置为索引。

SalePrice是我们要了解和预测的因变量,因此我将列重命名为“ Y”。

TotalQuall,GarageCars,FullBath和MSSubClass是类别变量,其他则是数字变量。

只有LotFrontage包含丢失的数据。

dtf = dtf.set_index('Id')dtf = dtf.rename(columns={'SalePrice':'Y'})

可视化是数据分析的最佳工具,前提是你要知道什么样的图更适合不同类型的变量。因此我们要用代码来为不同的示例绘制适当的可视化效果。

首先,让我们看看单变量分布(只有一个变量的概率分布)。直方图是一种完美的方法,可以粗略地反映单个数值数据的基本分布密度。我建议使用直方图图通过数据组的四分位数以图形方式来进行描述。绘制目标变量:x = 'Y'fig, ax = plt.subplots(nrows=1, ncols=2, sharex=False, sharey=False)fig.suptitle(x, fontsize=20)###分布ax[0].title.set_text('distribution')variable = dtf[x].fillna(dtf[x].mean())breaks = np.quantile(variable, q=np.linspace(0, 1, 11))variable = variable[ (variable > breaks[quantile_breaks[0]]) & (variable < breaks[quantile_breaks[1]]) ]sns.distplot(variable, hist=True, kde=True, kde_kws={'shade': True}, ax=ax[0])des = dtf[x].describe()ax[0].axvline(des['25%'], ls='--')ax[0].axvline(des['mean'], ls='--')ax[0].axvline(des['75%'], ls='--')ax[0].grid(True)des = round(des, 2).apply(lambda x: str(x))box = '\n'.join(('min: ' des['min'], '25%: ' des['25%'], 'mean: ' des['mean'], '75%: ' des['75%'], 'max: ' des['max']))ax[0].text(0.95, 0.95, box, transform=ax[0].transAxes, fontsize=10, va='top', ha='right', bbox=dict(boxstyle='round', facecolor='white', alpha=1))###方块图ax[1].title.set_text('outliers (log scale)')tmp_dtf = pd.DataFrame(dtf[x])tmp_dtf[x] = np.log(tmp_dtf[x])tmp_dtf.boxplot(column=x, ax=ax[1])plt.show()

216360308_3_20210226011905787

该人群中房屋的平均价格为$181k,分布高度偏斜,并且两边都有异常值。

此外,条形图适合于理解单个分类变量的标签频率。 让我们以FullBath(浴室数量)变量为例:它具有常规性(2个浴室> 1个浴室),但不是连续的(一个家庭不能有1.5个浴室),因此可以将其作为分类进行分析。

x = 'Y'ax = dtf[x].value_counts().sort_values().plot(kind='barh')totals= []for i in

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值