利用scikit-learn进行机器学习入门案例
相信很多人都知道波士顿房价的数据集,一个非常经典的机器学习入门案例数据集。在本文中直接使用sklearn中自带的数据集来进行数据分析和建模,主要内容包含:
- 数据探索
- 相关性分析
- 变量研究
- 线性回归模型探索
- 模型改进
导入库
1 | import numpy as np |
导入内置数据
导数据
从sklearn中导入内置的波士顿房价数据集:
1 | boston = datasets.load_boston() |
1 | df["MEDV"] = y |
查看数据字段、类型:
1 | df.info() |
字段说明
字段对应的中文解释,来自网上的说明:
- CRIM:城镇人均犯罪率
- ZN: 占地面积超过2.5万平方英尺的住宅用地比例
- INDUS:城镇上非零售业务地区的 比例
- CHAS:虚拟变量;如果土地在查尔斯河,取值1;否则为0
- NOX:一氧化氮浓度
- RM:平均每个居民房数
- AGE:在1940年之前建成的所有者占用单位的比例
- DIS: 与波士顿的5个就业中心之间的加权距离
- RAD: 辐距离住房最近的公路入口编号
- TAX:每10,000美元的全额物业税
- PTRATIO:城镇师生比例大小
- B:1000(Bk-0.63)^2,其中 Bk 指代城镇中黑人的比例
- LSTAT:全部人口中地位较低人群的百分数大小
- MEDV:目标变量,以1000美元来进行计算的自由住房的中位数大小
基本信息
数据形状和缺失值情况:
统计信息
数据统计信息主要是针对数值型的字段。这个案例中的数据刚刚好都是数值型字段,能够迅速看到每个字段的:中值、方差、最小值、四分之一分位数等
相关性检验
计算相关系数
绘制相关系数的热力分布图:
查看每个特征和目标变量MEDV之间的相关系数:
1 | corr["MEDV"].sort_values() |
从绝对值的角度来看:LSTAT、RM、PTRATIO这3个字段是最具有相关性的~
多变量研究
研究不同自变量之间、自变量和因变量之间的关系
1 | sns.pairplot(df[["LSTAT","INDUS","PTRATIO","MEDV"]]) # 绝对值靠前3的特征 |
数据集划分
划分给定的数据集,比例是8:2
1 | X = df.drop("MEDV",axis=1) |
线性回归模型(重点)
将506个样本13个特征组成的矩阵赋值给变量X,变量X为大写字母的原因是数学中表示矩阵使用大写字母。 将506个样本1个预测目标值组成的矩阵赋值给变量 Y。
表中13列数据就是13个是样本特征(属性),机器学习的目的就是得到一个线性回归模型,即:
$$
Y=\theta_{0}+\theta_{1} \times X_{1}+\theta_{2} \times X_{2}+\theta_{3} \times X_{3}+\cdots+\theta_{13} \times X_{13}
$$
线性回归模型需要学习的就是$ \theta_{0}, \theta_{1}, \theta_{2}, \cdots \theta_{13} $这14个参数,然后将y用这个13个参数来表示。
建模
1 | from sklearn.linear_model import LinearRegression |
预测
1 | # 对测试集的数据进行预测 |
指标得分
主要是考察两个指标的得分:
- 在测试集上的得分score
- 测试数据和预测数据之间的RMSE得分
1 | # 得分 |
回归系数
下面是本次建模案例得到的13个回归系数:
1 | coef1 |
1 | le_df = pd.DataFrame() |
真实值和预测值的对比
1 | test_pre = pd.DataFrame({"test": y_test["MEDV"].tolist(), |
1 | test_pre.plot(figsize=(18,10)) |
我们对比真实值和预测值的大小,发现:有42.15%左右的测试集中真实值是大于预测值
结论1
通过上面的结果我们发现:
- 超过半数的预测值是比真实值要大的,预测的房价偏高
- 波士顿房价的数据比较干净,预处理和特征工程部分的工作相对会少一些,上面的建模过程几乎没有涉及到太多特征工程的工作
模型评价
测试集上评价
将真实值和预测值的散点分布图画在坐标轴上
1 | plt.scatter(y_test, predict1, label="test") |
从上图中看到:
- 在10-30之间的房价预测的更为准确些
- 当超过30后,预测的结果会偏小;上面的统计结果页表明,预测值会大于真实值
整体数据集评价
我们对整个数据集X上进行建模:
1 | predict_all = le.predict(X) |
比较整体数据集上的真实值和预测值:
1 | all_pre = pd.DataFrame({"test": y["MEDV"].tolist(), |
1 | all_pre.plot(figsize=(18,10)) |
1 | plt.scatter(y, predict_all, label="y_all") |
模型改进
数据标准化
1 | from sklearn.preprocessing import StandardScaler |
决策树回归
1 | from sklearn.tree import DecisionTreeRegressor |
GradientBoosting(梯度提升)
1 | from sklearn import ensemble |
目前效果是最好的~
Lasso回归
Lasso的全称是:Least Absolute Shrinkage and Selection Operator
Lasso也是惩罚其回归系数的绝对值;另外一种方式岭回归,使用的是平方形式
1 | from sklearn.linear_model import Lasso |
SVR-支持向量回归
1 | from sklearn.svm import SVR |
结论2
对数据进行标准化和采用不同的回归模型后,发现:
- 采用Gradient Boosting 算法的话,效果是最好的。最终的评分高达0.9017
- 在机器学习建模的过程中,数据预处理方案和特征工程的设计是很重要的,对我们最终的效果会有很大的影响
在实际工作项目中也是如此,数据预处理、特征工程、筛选有效的特征会花费数据工程师很多的精力~