摘要
在本文中,我将使用数据科学和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()
关于列的详细信息可以在提供的数据集链接中找到。
表格中的每一行代表一个特定的房子。
一切准备就绪,我将从分析数据开始,然后选择特征,建立机器学习模型并进行预测。
数据分析
在统计学中,探索性数据分析是一个总结数据集主要特征的过程,以了解数据在形式化建模或假设检验任务之外能告诉我们什么。
一般来说,如果我想知道有多少分类变量和数值变量,以及丢失数据的比例,我都会从对数据集的概述开始。有时候会很难识别变量的类型,因为类别可以表示为数字。为此,我编写了一个简单的函数来帮助我们:
'''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 ')
该数据集中共有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()
该人群中房屋的平均价格为$181k,分布高度偏斜,并且两边都有异常值。
此外,条形图适合于理解单个分类变量的标签频率。 让我们以FullBath(浴室数量)变量为例:它具有常规性(2个浴室> 1个浴室),但不是连续的(一个家庭不能有1.5个浴室),因此可以将其作为分类进行分析。
x = 'Y'ax = dtf[x].value_counts().sort_values().plot(kind='barh')totals= []for i in