回归模型简介及python代码实现

文章内容来自知乎文章的总结,原网站是:数据分析师工作中“数据分析建模”到底是什么?要学习得话有什么途径? - 知乎                            代码是《机器学习:Python实践》里面的例子

首先,知晓什么是“回归”

在西方,一些统计学家做研究时发现了一个奇怪现象,小孩子的身高不会跟随父母的身高,也就是说哪怕父母很高,小孩子也并不会无限制的增长下去,而是向平均身高靠近的。当时人们还普遍受到遗传学的影响。研究过后就总结出一个词“回归”(regression,还有退化的意思)。

其次,明确回归模型有什么用

明确一点,回归模型就是用来做预测的。

在数据分析中预测有两种,一种是分类型预测,另一种是连续型预测。

  • 分类型预测:比如我的客户以后还来不来?工厂生产的某个产品质量合格不合格?明天的天气怎么样?这就是分类型结果的预测。
  • 连续型预测:比如预测明年的销售额达到多少?需要多少天可以完成目标?预测结果是连续型数字。

大部分回归分析都被用来做连续型预测,逻辑回归除外。

重点,了解回归分析怎么做

总的概括一共有五步:

第一步:判断是否可以做回归预测;

第二步:找到需要预测的标签,影响预测结果的标签,也就是自变量和因变量;

第三步:收集数据,进行特征工程,相关性检验;

第四步:计算模型,检验结果;

第五步:进行预测。

举例:商品在新上市之前都会做销量预测,需要根据竞品销量预测的结果去把控库存情况,尽量减少库存成本。

根据回归分析的五个步骤逐个执行。

第一步:该案例适合做预测分析,因为需要通过预测销量来减少库存成本;

第二步:确定因变量和自变量。在这个问题中因变量也就是需要预测的是销售额,自变量也就是影响预测的结果是预约人数。

第三步:当我们拿到数据以后需要看以下两个标签之间是否有关系,这时候可以通过散点图去判断,因为散点图可以清晰地看出两个标签之间是何种相关性,可以选择最适合的模型。通过作图发现因变量和自变量具有明显的线性关系的,可以使用线性回归来做。

第四五步:可以通过Python、R语言、SPSS或者Excel都可以做回归预测。

最后,看看回归模型的实际应用

当我们有了回归模型之后就可以根据回归模型去预测。比如我的竞品指数为1.3,带入模型以后预测销量为90.6万,仓储部门就可以根据这个销量去准备货品了。

当然回归分析也是有一定的局限性的:

回归表示的只是因变量和自变量之间在数据上的相关性,实际上两个变量在业务上不存在任何的因果关系,所以在使用和给别人描述的时候一定要注意。

Python代码实现

在这个项目中将分析研究波士顿房价(Boston House Price)数据集,这个数据集中的每一行数据都是对波士顿周边或城镇房价的描述。数据是1978年统计收集的。数据中包含以下14个特征和506条数据(UCI机器学习仓库中的定义)。

# 导入类库
import  numpy as np
import pandas as pd
from numpy import  arange
from matplotlib import pyplot
from pandas import  read_csv
from pandas import  read_excel
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 = 'Boston House Price.xlsx'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE'  ,'DIS','RAD','TAX','PTRATIO','B','LSTAT' ,'MEDV']
dataset = read_excel(filename,names=names)
# print(dataset.dtypes)
# 查看最开始的30行
# set_option('display.max_colwidth', 120)
# print(dataset.head(30))
# 描述性统计信息
# set_option('display.float_format', '{:.1f}'.format)
# print(dataset.describe())
# 关联关系
# 数据可视化
# 直方图
# dataset.hist(sharex=False,sharey=False,xlabelsize=1,ylabelsize=1)
# pyplot.show()
# 密度图
# dataset.plot(kind ='density',subplots = True,layout = (4,4),sharex = False, fontsize = 1)
# pyplot.show()
# 箱线图
# dataset.plot(kind='box',subplots = True, layout = (4,4),sharex = False,sharey = False,fontsize = 8 )
# pyplot.show()
# 散点矩阵图
# scatter_matrix(dataset)
# pyplot.show()
# 分离数据集
array = dataset.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)
# 评估算法 -- 评估标准
num_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'
# 评估算法 -- baseline
# 线性算法:线性回归(LR)、套索回归(LASSO)和弹性网络回归(EN)。
# 非线性算法:分类与回归树(CART)、支持向量机(SVM)和K近邻算法(KNN)
models = {}
models['LR'] = LinearRegression()
models['LASS0'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVR()
# 评估算法
results = []
for key in models:
    kfold = KFold(n_splits = num_folds,random_state=seed,shuffle= True)
    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 Comparsion')
# ax = fig.add_subplot(111)
# pyplot.boxplot(results)
# ax.set_xticklabels(models.keys())
# pyplot.show()
# 评估算法  正态化数据
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,shuffle= True)
    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 Comparsion')
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,shuffle= True)
# 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))

# 集成算法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,shuffle= True)
# 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,shuffle= True)
# 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_))

#  训练模型
scaler = StandardScaler().fit(X_train)
rescaledX = scaler.transform(X_train)
gbr = ExtraTreesRegressor(n_estimators=80)
gbr.fit(X=rescaledX,y=Y_train)
# 评估算法模型
rescaledX_validation = scaler.transform(X_validation)
predictions = gbr.predict(rescaledX_validation)
print(mean_squared_error(Y_validation,predictions))
















































































































































































  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值