回归项目实例

项目模板

#Python机器学习项目的模板

#1.定义问题
#a)导入类库
#b)导入数据集

#2.理解数据
#a)描述性统计
#b)数据可视化

#3.数据准备
#a)数据清洗
#b)特征选择
#c)数据转换

#4.评估算法
#a)分离数据集
#b)定义模型评估标准
#c)算法审查
#d)算法比较

#5.优化模型
#a)算法调参
#b)集成算法

#6.结果部署
#a)预测评估数据集
#b)利用整个数据集生成模型
#c)序列化模型

1.定义问题
在这个项目中分析研究波士顿房价数据集,这个数据集中的每一行数据都是对波士顿周边或城镇房价的描述。数据中包含14个特征和506条数据。导入数据集。

#导入类库
import numpy as np
from numpy import arange
from matplotlib import pyplot
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 = '/home/hadoop/DataSet/housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names)

2.理解数据
查看数据维度

#理解数据
print(data.shape)

查看各个特征属性的字段类型

print(data.dtypes)

查看最开始30条记录

set_option('display.line_width',120)
print(data.head(30))

查看数据的描述性统计信息

#描述性统计信息
set_option('precision',1)
print(data.describe())

查看数据特征之间的两两关联关系

#关联关系
set_option('precision',2)
print(data.corr(method='pearson'))

通过上面结果可以看到,有些特征属性之间具有强关联关系(>0.7或<-0.7)

数据可视化
单一特征图表
首先查看每一个数据特征单独的分布图,多查看几种不同的图表有助于发现更好的方法。可以通过查看各个数据特征的直方图,来感受一下数据的分布情况。

#直方图
data.hist(sharex=False,sharey=False,xlabelsize=1,ylabelsize=1)
pyplot.show()

可从中看到一些数据特征呈指数分布,有些数据特征呈双峰分布。

通过密度图可以展示这些数据的特征属性,密度图比直方图更加平滑地展示了这些数据特征。

#密度图
data.plot(kind='density',subplots=True,layout=(4,4),sharex=False,fontsize=1)
pyplot.show()

通过箱线图可以查看每一个数据特征的状况,也可以很方便地查看数据分布的偏态程度。

#箱线图
data.plot(kind='box',subplots=True,layout=(4,4),sharex=False,sharey=False,fontsize=8)
pyplot.show()

多重数据图表
利用多重数据图表来查看不同数据特征之间的相互影响关系。

scatter_matrix(data)
pyplot.show()

通过散点矩阵图可以看到,虽然有些数据特征之间的关联关系很强,但是这些数据分布结构也很好。即使不是线性分布结构,也是可以很方便进行预测的分布结构。

#相关矩阵图
fig = pyplot.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)
pyplot.show()

执行结果如图,从图例可得,数据特征属性之间的两两相关性,有些属性之间是强相关的,建议在后续的处理中移除这些特征属性,以提高算法的准确度。

通过数据的相关性和数据的分布等发现,数据集中的数据结构比较复杂,需要考虑对数据进行转换,以提高模型的准确度。可以尝试从以下几个方面对数据进行处理:
a.通过特征选择来减少大部分相关性的特征
b.通过标准化数据来降低不同数据度量单位带来的影响
c.通过正态化数据来降低不同的数据分布结构,以提高算法的准确度。

可以进一步查看数据的可能性分级(离散化),它可以帮助提高决策树算法的准确性。

分离评估数据集

#分离数据集
array = data.values
X = array[:,0:13]
Y = array[:,13]
validation_size = 0.2
seed= 7
X_train,X_validation,Y_train,Y_validation = train_test_split(X,Y,test_size=validation_size,random_state=seed)

评估算法
线性算法:线性回归(LR),LASSO和弹性网络回归
非线性算法:分类与回归树,支持向量机和K近邻算法

#评估算法 - baseline
models = {}
models['LR'] = LinearRegression()
models['LASSO'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVR()
#评估算法
results = []
num_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'
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 = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

评估算法——正态化数据
也许因为原始数据中不同特征属性的度量单位不一样,导致有的算法结果不是很好。接下来通过对数据进行正态化,再次评估这些算法。在这里对训练数据集进行数据转换处理,将所有的数据特征值转换为“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()))
#评估算法----箱线图
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

调参改善算法

#调参改善算法-----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.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近邻,分类与回归树算法进行集成,来看看算法能否提高。
装袋算法:随机森林(RF)和极端随机树(ET)
提升算法:AdaBoost(AB)和随机梯度上升(GBM)

集成算法调参

猜你喜欢

转载自blog.csdn.net/heloiselt/article/details/80945808