回归项目实例

项目模板

#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)

集成算法调参

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Python数据分析项目实例: 项目名称:电影评分预测 项目描述: 根据历史用户对电影的评分数据,预测用户对未看过电影的评分。 数据集: 使用MovieLens数据集,包含用户对电影的评分数据、电影的元数据和用户的个人信息。 分析流程: 1. 数据清洗和预处理:将数据集导入Python中,去除缺失值、异常值和重复值,进行数据格式转换和数据类型转换,并进行数据归一化和标准化处理。 2. 特征工程:根据电影元数据和用户个人信息,提取相关特征,如电影类型、演员、导演、年份、评分次数、用户年龄、别、职业等。对特征进行特征选择和特征降维处理。 3. 模型选择与训练:选择合适的算法,如线回归、决策树、随机森林、支持向量机和神经网络等。将数据集划分为训练集和测试集,进行模型训练和评估。通过交叉验证和网格搜索等方法,调整模型参数,提高模型的预测能力。 4. 模型预测和评估:使用优化后的模型进行未知电影的评分预测,评估模型的准确、召回率、精确度和F1得分等指标。 5. 结果展示和可视化:将预测结果可视化展示,如绘制ROC曲线、PR曲线和误差分布图等,对模型进行优化和改进。 技术栈: Python、Pandas、Numpy、Matplotlib、Seaborn、Scikit-learn等。 参考链接: https://github.com/llSourcell/recommender_system_challenge https://www.kaggle.com/rounakbanik/movie-recommender-systems
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值