# -*- coding: utf-8 -*-
"""回归问题案例.ipynbAutomatically generated by Colaboratory.Original file is located athttps://colab.research.google.com/drive/1l8xlYKSd8nljVVEEriZyoc0oivqMDWR0
"""# 导入必要的包
import numpy as np
import matplotlib.pyplot as plt
from pandas import read_csv
from pandas import set_option
from pandas.plotting import scatter_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error# 导入数据
filename = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PRTATTO', 'B', 'LSTAT', 'MEDV' ]
data = read_csv(filename, names=names, delim_whitespace=True) # 指定文件的分隔符为空格键data.shapedata.head()data.describe()# 理解数据
print(data.dtypes)#
set_option('precision', 1)
print(data.describe())# 查看特征之间的两两关联关系
set_option('precision', 2)
print(data.corr(method='pearson'))# 数据可视化
# 单一特征图表
data.hist(sharex=False, sharey=False, xlabelsize=1, ylabelsize=1, layout=(3,5), bins=100)
plt.show()# 用密度图展示:更加平滑展示数据特征
data.plot(kind='density', subplots=True, layout=(4,4), sharex=False, fontsize=1)
plt.show()# 箱线图
data.plot(kind='box', subplots=True, layout=(4,4), sharex=False, sharey=False, fontsize=8)
plt.show()"""### 多重数据图表看不同数据特征之间的相互影响关系。
"""# 散点矩阵图
scatter_matrix(data)
plt.show()# 相关矩阵图fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(data.corr(), vmin=-1, vmax=1, interpolation='none')
fig.colorbar(cax)
ticks = np.arange(0,14,1)
ax.set_xticks(ticks)
ax.set_yticks(ticks)
ax.set_xticklabels(names)
ax.set_yticklabels(names)
plt.show()"""数据集中的数据结构较复杂,需要考虑对数据进行转换,以提高模型的准确度。- 特征选择来减少大部分相关性高的特征
- 标准化数据来降低不同数据度量单位带来的影响
- 正态化数据以降低不同的数据分布结构,提高算法的准确度
"""# 分离数据集
array = data.values
X = array[:, 0:13]
y = array[:, 13]
test_size = 0.2 # 20%测试集
seed = 7
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=seed)X_train.shapeX_test.shapey_train.shape, y_test.shape"""### 评估算法从直观上看,只能得出由于部分数据的线性分布,线性回归算法和弹性网络回归算法对解决问题可能有效。且由于数据的离散化,用决策树算法或者SVM算法可能能生成高准确度的模型。**但是我们仍然不清楚到底哪个算法能生成准确度最高的模型。**需要设计评估框架来帮助我们选择。这里用10折交叉验证来分离数据,用均方误差来比较算法准确度。其中,均方误差越趋近于0,算法的准确度就越高。
"""num_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'# 先不对原始数据进行任何处理,得出模型性能评价的基准
models = {}
models['LR'] = LinearRegression()
models['Lasso'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVR()# 直接评估算法,得出一个baseline
results = []
for key in models:kfold = KFold(n_splits=num_folds, random_state=seed)cv_result = cross_val_score(models[key], X_train, y_train, cv=kfold, scoring=scoring)results.append(cv_result)print("%s: %f (%f)" % (key, cv_result.mean(), cv_result.std()))# 评估图——箱线图
fig = plt.figure()
fig.suptitle('算法比较')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(models.keys())
plt.show()"""### 分析线性算法的分布比较类似,K近邻算法结果分布比较紧凑。如何从箱线图上看出数据分布的优劣呢?### 正态化数据将数据变成中值为0,方差为1的数据。用`Pipeline`来正态化数据和对模型进行评估,可以防止数据泄露。
"""# 评估算法
pipelines = {}
pipelines['ScalerLR'] = Pipeline([('Scaler', StandardScaler()), ('LR', LinearRegression())])
pipelines['ScalerLASSO'] = Pipeline([('Scaler', StandardScaler()), ('Lasso', Lasso())])
pipelines['ScalerEN'] = Pipeline([('Scaler', StandardScaler()), ('EN', ElasticNet())])pipelines['ScalerKNN'] = Pipeline([('Scaler', StandardScaler()), ('KNN', KNeighborsRegressor())])
pipelines['ScalerCART'] = Pipeline([('Scaler', StandardScaler()), ('CART', DecisionTreeRegressor())])
pipelines['ScalerSVM'] = Pipeline([('Scaler', StandardScaler()), ('SVM', SVR())])results = []
for key in pipelines:kfold = KFold(n_splits=num_folds, random_state=seed)cv_result = cross_val_score(pipelines[key], X_train, y_train, cv=kfold, scoring=scoring)results.append(cv_result)print("%s: %f (%f)" % (key, cv_result.mean(), cv_result.std()))"""### 分析正则化以后,KNN算法的MSE最优。
"""# 评估算法:箱线图
fig = plt.figure()
fig.suptitle('算法评估')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(models.keys())
plt.show()type(results)results[0]"""### 开始调参通过上面的分析我们看到KNN算法具有最好的结果,能不能更好呢?这就进入到调参的过程了,即前面学过的网格搜索和随机搜索等方法。
"""# 网格搜索
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)# 遍历参数
param_grid = {'n_neighbors': [1,3,5,7,9,11,13,15,17,19,21]}
model = KNeighborsRegressor()
kfold = KFold(n_splits=num_folds, random_state=seed)
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(X=rescaledX, y=y_train)print('最优: %s 使用%s' % (grid_result.best_score_, grid_result.best_params_))cv_results = zip(grid_result.cv_results_['mean_test_score'], grid_result.cv_results_['std_test_score'], grid_result.cv_results_['params'])for mean, std, param in cv_results:print('%f (%f) with %r' % (mean, std, param))"""### 集成算法除了使用调参方法以外,还可以用集成算法提升准确率。现在对线性回归,K近邻以及回归树进行集成看看效果。
"""ensembles = {}
ensembles['ScaledAB'] = Pipeline([('Scaler', StandardScaler()), ('AB', AdaBoostRegressor())])
ensembles['ScaledAB-KNN'] = Pipeline([('Scaler', StandardScaler()), ('ABKNN', AdaBoostRegressor(base_estimator=KNeighborsRegressor(n_neighbors=3)))])
ensembles['ScaledAB-LR'] = Pipeline([('Scaler', StandardScaler()), ('ABLR', AdaBoostRegressor(LinearRegression()))])
ensembles['ScaledRFR'] = Pipeline([('Scaler', StandardScaler()), ('RFR', RandomForestRegressor())])
ensembles['ScaledETR'] = Pipeline([('Scaler', StandardScaler()), ('ETR', ExtraTreesRegressor())])
ensembles['ScaledGBR'] = Pipeline([('Scaler', StandardScaler()), ('GBR', GradientBoostingRegressor())])results = []
for key in ensembles:kfold = KFold(n_splits=num_folds, random_state=seed)cv_result = cross_val_score(ensembles[key], X_train, y_train, cv=kfold, scoring=scoring)results.append(cv_result)print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))# 评估图——箱线图
fig = plt.figure()
fig.suptitle('算法比较')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(ensembles.keys())
plt.show()"""### 集成算法调参集成算法有一个参数`n_estimators`, 这个可以调整,看看是否可以得到有提升的结果。
"""# GBM算法调参——网格搜索
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)# 遍历参数
param_grid = {'n_estimators': [10,50,100,200,300,400,500,600,700, 800,900]}
model = GradientBoostingRegressor()
kfold = KFold(n_splits=num_folds, random_state=seed)
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(X=rescaledX, y=y_train)
print('最优: %s 使用%s' % (grid_result.best_score_, grid_result.best_params_))# ET算法调参——网格搜索
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)# 遍历参数
param_grid = {'n_estimators': [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}
model = ExtraTreesRegressor()
kfold = KFold(n_splits=num_folds, random_state=seed)
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring=scoring, cv=kfold)
grid_result = grid.fit(X=rescaledX, y=y_train)
print('最优: %s 使用%s' % (grid_result.best_score_, grid_result.best_params_))"""### 显示最后结果最好的是ET模型。"""# 训练模型
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)
gbr = ExtraTreesRegressor(n_estimators=30)
gbr.fit(X=rescaledX, y=y_train)# 评估算法模型
rescaledX_test = scaler.transform(X_test)
predictions = gbr.predict(rescaledX_test)type(rescaledX_test)rescaledX_testprint(mean_squared_error(y_test, predictions)) # 最后求出均方误差,结果还不错
# 输出
# 14.653818518518516

END.

【机器学习】回归案例实践:数据处理建模调参相关推荐

  1. Python机器学习建模的标准流程(特征工程+建模调参+模型评估+全流程可视化)

    作者CSDN:进击的西西弗斯 本文链接:https://blog.csdn.net/qq_42216093/article/details/116994199 版权声明:本文为作者原创文章,转载需征得 ...

  2. 「建模调参」之零基础入门数据挖掘

    Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...

  3. 【数据挖掘】心跳信号分类预测 之 建模调参 —— 学习笔记(四)

    目录 四.建模调参 4.1 内容简介 4.2 模型原理与性质概述 4.2.1 分类模型 4.2.2 时间序列模型 4.2.3 推荐教材 4.3 模型对比与性能评估 4.3.1 逻辑回归 4.3.2 决 ...

  4. 【零基础入门数据挖掘】-建模调参

    Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...

  5. 【算法竞赛学习】二手车交易价格预测-Task4建模调参

    二手车交易价格预测-Task4 建模调参 四.建模与调参 Tip:此部分为零基础入门数据挖掘的 Task4 建模调参 部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 赛题:零 ...

  6. 心电图心跳信号多分类预测-建模调参(四)

    1.相关模型及调参方法 1.1 相关模型介绍 逻辑回归模型 https://blog.csdn.net/han_xiaoyang/article/details/49123419 决策树模型 http ...

  7. #数据挖掘--第3章:建模调参之支持向量机SVM初体验

    #数据挖掘--第3章:建模调参之支持向量机SVM初体验   序言:本系列博客面向初学者,只讲浅显易懂易操作的知识.   基础知识准备:   一.我们在进行训练之前,常常要对样本进行归一化.标准化或正则 ...

  8. 数据挖掘-二手车价格预测 Task04:建模调参

    数据挖掘-二手车价格预测 Task04:建模调参 模型调参部分 利用xgb进行五折交叉验证查看模型的参数效果 ## xgb-Model xgr = xgb.XGBRegressor(n_estimat ...

  9. 数据挖掘实践(金融风控)——task4:建模调参

    文章目录 模型相关原理 1.逻辑回归 2.决策树模型 3.集成模型集成方法 模型评估方法 1.留出法 2.交叉验证法 3. 自助法 4.数据集划分总结 模型评价标准 模型调参 1.贪心调参 2.网格搜 ...

最新文章

  1. Java线上应用故障排查之一:高CPU占用
  2. Intel Realsense D435 python (Python Wrapper)examples 官方案例汇总
  3. ruby 集合 分组_在Ruby中打印集合的元素
  4. Java数据结构和算法 - 堆
  5. 有道词典 Chrome取词插件
  6. 如果您的iPhone关闭,静音或不打扰,警报是否会起作用?
  7. 各大互联网大厂JAVA实习招聘岗位要求
  8. 多维泰勒网matlab,非线性定常系统的多维泰勒网优化跟踪控制
  9. 往MYSQL中插入,读写图片!
  10. 自己无聊做的一个简单的企业进销存管理系统
  11. 抖音电商的带货情况究竟如何,抖音电商带货前景如何
  12. 猿学~黑客、红客、白帽子之间的技术较量,为什么大公司都有黑客团队?
  13. 信息系统项目管理师与系统集成项目管理工程师5大区别
  14. Nginx代理无法访问Nexus问题
  15. 荒诞 (absurdity)
  16. Cadence allegro小技巧总结
  17. 分位数Quantiles
  18. zedboard各种相关资料整理中
  19. access团员人数公式_2013年计算机二级Access上机模拟试卷二
  20. [台剧]《倚天屠龙记》永远的经典——孙兴版杨逍

热门文章

  1. HTML知识积累及实践(五) - 表单元素
  2. 正则表达式及其在Java和Python中的相关操作
  3. vue的边距怎么设置_Vue项目如何适应浏览器,去除容器控件与浏览器四周的距离...
  4. pythonlauncher是干什么用的_python的launcher用法知识点总结
  5. c++中*是什么意思_int在python中什么意思
  6. 闪迪u盘量产工具万能版_我身边的“闪迪色”闪迪彩色手机U盘系列| 大家测573...
  7. C++为什么空格无法输出_那些C/C++程序员该具备的32个编程修养习惯!
  8. 怎么把线稿提取出来_【PS技巧】如何用PS快速提取线稿?
  9. python控制结构是,python 程序控制结构
  10. sql 新建表 alter_SQL ALTER表