[1]欧高炎、朱占星、董彬、鄂维南.《数据科学导引》.北京市西城区德胜门外大街4号:高等教育出版社,2017年12月20日:p69-70.

事件原因:

很简单,收益最大化。客套话就不多说了。

1、收集数据

这个数据是谢老师给我的,所以这里就不写怎么弄的数、。
数据内容:

它的数据分为两种,一种是日结的租车,一种是小时结的租车,readme是对里面数据的一些解释(需要的我会写出来)

数据特征:
- instant: record index
- dteday : date
- season : season (1:springer, 2:summer, 3:fall, 4:winter)
- yr : year (0: 2011, 1:2012)
- mnth : month ( 1 to 12)
- hr : hour (0 to 23)
- holiday : weather day is holiday or not (extracted from http://dchr.dc.gov/page/holiday-schedule)
- weekday : day of the week
- workingday : if day is neither weekend nor holiday is 1, otherwise is 0.
+ weathersit :
- 1: Clear, Few clouds, Partly cloudy, Partly cloudy
- 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
- 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
- 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog
- temp : Normalized temperature in Celsius. The values are divided to 41 (max)
- atemp: Normalized feeling temperature in Celsius. The values are divided to 50 (max)
- hum: Normalized humidity. The values are divided to 100 (max)
- windspeed: Normalized wind speed. The values are divided to 67 (max)
- casual: count of casual users
- registered: count of registered users
- cnt: count of total rental bikes including both casual and registered

2、探索和准备数据

导入数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data_day = pd.read_csv(r"C:\Users\dream\Desktop\Bike-Sharing-Dataset\day.csv")

画一下两种方法的租借量的直方图,代码如下

pl.hist(data_day["cnt"])
pl.xlabel('data_day')
pl.savefig("2.jpg")
pl.show()


在我们的数据中,租借量分布的尾部经过直方图的峰部后延伸得很远。因为线性回归假设因变量的分布为正态分布,所以这种分布是不理想的。在实际应用中,线性回归的假设往往会被违背。如果需要,我们在后面能够修正该假设。(这个会导致最后那个R^2偏低,欠拟合,后面要修正的)。

之后我们将要面临的另一个问题就是回归模型需要每一个特征都是数值型的,而在我们的数据中,我们有非数值类型的特征。我们需要对这些数据进行一些处理,不然这些数据我们无法直接使用。(标红的都是非数值型的)

我们以season数据为例,展示一下如何处理这些数据

data_day['season'].describe()


通过检查数据集可以看到这个数据是有只有四个量的。分别是1、2、3、4
因此对于这种类型数据我们可以采取虚拟编码技术(R语言中的技术)虚拟编码允许名义特征通过为一个特征的每一类创建一个二元变量来将其处理成数值型变量,即如果观测值属于某一类,那就设定为1,否则设定为0。例如,性别(sex)变量有两类:男性(male)和女性(female)。这将分为两个二进制值变量,R中将其命名为sexmale和sexfemale。对于观测值,如果sex=male,那么sexmale=1、sexfemale=0;如果sex=female,那么sexmale=0、sexfemale=1。相同的编码适用于有3个类别甚至更多类别的变量,具有4个类别的特征region可以分为4个变量:regionnorthwest、regionsoutheast、regionsouthwest、regionnortheast。当添加一个虚拟编码的变量到回归模型中时,一个类别总是被排除在外作为参照类别。然后,估计的系数就是相对于参照类别解释的。以上思想,是我们在面对定性因素时的常用处理手段。它可以帮助我们将定性变量进行量化,已达到定性因素能与定量因素有着相同作用之目的。

实现代码

data_dayy=data_day['cnt']
data_dayx= pd.get_dummies(data_day,columns=['season','yr','mnth','yr','holiday','weekday','workingday','weathersit'])

我们已经完成了对insurance中类型变量的虚拟编码。然后在回归模型中保留一组对照组,分别选取每个分类元素的_1作为对照组(选择其他的也可以,这里是为了方便)

代码如下:

data_dayx1=data_dayx.drop(['season_1'],axis=1)
data_dayx2=data_dayx1.drop(['yr_1'],axis=1)
data_dayx3=data_dayx2.drop(['mnth_1'],axis=1)
data_dayx4=data_dayx3.drop(['holiday_1'],axis=1)
data_dayx5=data_dayx4.drop(['weekday_1'],axis=1)
data_dayx6=data_dayx5.drop(['workingday_1'],axis=1)
data_dayX=data_dayx6.drop(['weathersit_1'],axis=1)
data_dayX=data_dayX.drop(['cnt'],axis=1)

使用一个简单的线性回归模型进行拟合

regr = linear_model.LinearRegression()
regr.fit(data_dayX, data_dayy)print('Intercept: %.2f'% regr.intercept_)
print('Coefficients: ')
print(regr.coef_)
print('Residual sum of squares: %.2f'% np.mean((regr.predict(data_dayX) - data_dayy) ** 2))
print('Variance score: %.2f' % regr.score(data_dayX, data_dayy))

拟合结果

day.csv

hour.csv

改进模型

如何对一个模型的R^2进行提升呢?
1 模型的设定——添加非线性关系

data_day['unhappy']=data_day['atemp']*data_day['atemp']
data_day['hum_atemp']=data_day['hum']*data_day['hum']
data_day['windouble']=data_day['windspeed']*data_day['windspeed']

2 转换——将一个数值型变量转换为一个二进制指标

data_day['windspeedt'] = 0for i in range(0, 730):if data_day['windspeed'][i] >= 0.4 :data_day['windspeedt'][i] = 1else:data_day['windspeedt'][i] = 0

3 模型的设定——加入相互作用的影响

data_day['doublehappy'] = data_day['weekday']*data_day['holiday']

优化后的效果

day.csv

hour.csv

源代码
day.csv优化后的源码

import pandas as pd
import pylab as pl
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_modeldata_day = pd.read_csv(r"C:\Users\dream\Documents\Tencent Files\2499536213\FileRecv\day.csv")
data_day=data_day.drop(['instant'],axis=1)
data_day=data_day.drop(['dteday'],axis=1)
data_day=data_day.drop(['casual'],axis=1)
data_day=data_day.drop(['registered'],axis=1)
data_day['doublehappy'] = data_day['weekday']*data_day['holiday']
data_day['unhappy']=data_day['atemp']*data_day['atemp']
data_day['hum_atemp']=data_day['hum']*data_day['hum']
data_day['windouble']=data_day['windspeed']*data_day['windspeed']data_day['windspeedt'] = 0for i in range(0, 730):if data_day['windspeed'][i] >= 0.4 :data_day['windspeedt'][i] = 1else:data_day['windspeedt'][i] = 0pl.hist(data_day["cnt"])
pl.xlabel('data_day')
pl.savefig("2.jpg")
data_dayy=data_day['cnt']
data_dayx= pd.get_dummies(data_day,columns=['season','yr','mnth','holiday','weekday','workingday','weathersit','doublehappy','windspeedt'])
print(data_day['windspeedt'])data_dayx1=data_dayx.drop(['season_1'],axis=1)
data_dayx2=data_dayx1.drop(['yr_1'],axis=1)
data_dayx3=data_dayx2.drop(['mnth_1'],axis=1)
data_dayx4=data_dayx3.drop(['holiday_1'],axis=1)
data_dayx5=data_dayx4.drop(['weekday_1'],axis=1)
data_dayx6=data_dayx5.drop(['workingday_1'],axis=1)
data_dayx7=data_dayx6.drop(['weathersit_1'],axis=1)
data_dayx8=data_dayx7.drop(['windspeedt_1'],axis=1)
data_dayX=data_dayx8.drop(['doublehappy_1'],axis=1)data_dayX=data_dayX.drop(['cnt'],axis=1)#这个用的是一个最简单的线性回归模型
regr = linear_model.LinearRegression()
regr.fit(data_dayX, data_dayy)print('Intercept: %.2f'% regr.intercept_)
print('Coefficients: ')
print(regr.coef_)
print('Residual sum of squares: %.2f'% np.mean((regr.predict(data_dayX) - data_dayy) ** 2))
print('Variance score: %.2f' % regr.score(data_dayX, data_dayy))

hour.csv优化后的源码

import pandas as pd
import pylab as pl
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_modeldata_day = pd.read_csv(r"C:\Users\dream\Documents\Tencent Files\2499536213\FileRecv\hour.csv")
# print(data_day[['temp','atemp','hum','windspeed','cnt']].corr())
data_day=data_day.drop(['instant'],axis=1)
data_day=data_day.drop(['dteday'],axis=1)
data_day=data_day.drop(['casual'],axis=1)
data_day=data_day.drop(['registered'],axis=1)
data_day=data_day.drop(['windspeed'],axis=1)
data_day=data_day.drop(['atemp'],axis=1)
# data_day['doublehappy'] = data_day['weekday']*data_day['holiday']
data_day['twotemp']=data_day['temp']*data_day['temp']
data_day['hum_atemp']=data_day['hum']*data_day['temp']*data_day['hum']
# data_day['windouble']=data_day['windspeed']*data_day['windspeed']# data_day['windspeedt'] = 0# for i in range(0, 730):
#     if data_day['windspeed'][i] >= 0.4 :
#         data_day['windspeedt'][i] = 1
#     else:
#         data_day['windspeedt'][i] = 0pl.hist(data_day["cnt"])
pl.xlabel('data_day')
pl.savefig("2.jpg")
data_dayy=data_day['cnt']
data_dayx= pd.get_dummies(data_day,columns=['season','yr','mnth','holiday','weekday','workingday'])
# print(data_day['windspeedt'])data_dayx1=data_dayx.drop(['season_1'],axis=1)
data_dayx2=data_dayx1.drop(['yr_1'],axis=1)
data_dayx3=data_dayx2.drop(['mnth_1'],axis=1)
data_dayx4=data_dayx3.drop(['holiday_1'],axis=1)
data_dayx5=data_dayx4.drop(['weekday_1'],axis=1)
data_dayx6=data_dayx5.drop(['workingday_1'],axis=1)
# data_dayx7=data_dayx6.drop(['weathersit_1'],axis=1)
# data_dayx8=data_dayx7.drop(['windspeedt_1'],axis=1)
# data_dayX=data_dayx7.drop(['doublehappy_1'],axis=1)data_dayX=data_dayx6.drop(['cnt'],axis=1)#这个用的是一个最简单的线性回归模型
regr = linear_model.LinearRegression()
regr.fit(data_dayX, data_dayy)print('Intercept: %.2f'% regr.intercept_)
print('Coefficients: ')
print(regr.coef_)
print('Residual sum of squares: %.2f'% np.mean((regr.predict(data_dayX) - data_dayy) ** 2))
print('Variance score: %.2f' % regr.score(data_dayX, data_dayy))

看了以上的源码,我突然意识到了一个问题,我删除的两个比较关键的数据!!!(两个的优化之中我都删除这些数据)
代码如下:

data_day=data_day.drop(['casual'],axis=1)
data_day=data_day.drop(['registered'],axis=1)

本来觉得这个倒是不会有多大影响,但是现在想想,我认识到了问题所在,是不是存在这样的一种可能,注册用户和非注册用户对这个单车的租借有着一定的差异!!!所以我是不是应该做一下他们两者的区别!!!因此我对两组的源码进行了一点点的修改,重新对其进行运算
hour.csv registered用户
hour.csv casual用户

从hour.csv中的数据可以看到registered用户与casual用户之间确实存在着较大的差异(所用的模型都是优化后的模型)接下来让我们再看看day.csv用户是否也存在这如此大的差异!!!
day.csv registered用户

day.csv casual用户

分析总结

线性回归模型本身并不难,其主要难点在于了解第三方库的对应方法。难点在于如何优化模型,需要考虑不同因子之间可能存在的关系,然后将其加入到线性回归模型中,想要优化模型只能不断的调整参数。但是一定要考虑到过拟合问题。一味的优化模型会导致过拟合现象,使得模型对训练数据有着很好的拟合度,但如果使用其他的数据进行测试拟合效果反而不好。

数据科学导引——租车人数预测模型 线性回归模型相关推荐

  1. 数据科学导引——各国幸福指数聚类数据集的分析

    各国幸福指数聚类数据集的分析 注:这里能不粘贴截图的我将不会粘贴截图,因为复制到学习通提交的时候我这边还要再弄一次图很麻烦,但是没数据谢老师又不能直观的看到. 1.观察数据 各国幸福指数数据集的介绍: ...

  2. 数据科学导引欧高炎重点知识一

    数据科学导引重点知识 1.说明 2.数据预处理 2.1特征编码 数字编码 One-Hot编码 哑变量编码 2.2缺失值处理 原因 删除法 均值填补 随机填补 1.贝叶斯方法 2.近似贝叶斯 基于模型的 ...

  3. 【每周一本书】之《数据科学导引》:我国首本中文版数据科学教材

    [数据猿导读]<数据科学导引>是由北京大数据研究院•博雅大数据学院针对新开设的数据科学与大数据技术专业编写的第一本中文版教材 编辑 | abby 官网 | www.datayuan.cn ...

  4. 数据科学导引上机(5)

    1源数据 此次用到的是青少年社交网络中常用词数据,借此进行市场调研 使用的方法是K-Means聚类方法,不介绍原理 2 数据探索和预处理 # 数据预处理 import pandas as pd tee ...

  5. 数据科学和人工智能技术笔记 十、模型选择

    十.模型选择 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 在模型选择期间寻找最佳预处理步骤 在进行模型选择时,我们必须小心正确处理预处理. 首先,GridSearc ...

  6. 数据科学和人工智能技术笔记 九、模型验证

    九.模型验证 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 准确率 # 加载库 from sklearn.model_selection import cross_v ...

  7. 数据科学与大数据分析之项目6-CNN模型图像分类

    用预先训练好的CNN模型进行图像分类 项目介绍 项目开始 项目介绍 本项目使用Caltech256来作为训练和测试集. 解压缩该文件,您将看到257个文件夹.每个文件夹对应一个类.使用预先训练的Inc ...

  8. 前置交换机数据交换_我们的数据科学交换所

    前置交换机数据交换 The DNC Data Science team builds and manages dozens of models that support a broad range o ...

  9. 鄂维南院士:数据科学的基本内容

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 作者:鄂维南院士 本文是鄂维南院士对数据科学这个全新学科的定义.摘自高等教育出版社<数据科学导引 ...

  10. 数据科学最常用流程CRISP-DM,终于有人讲明白了

    导读:什么是CRISP-DM?有什么用?本文带你搞明白. 作者:约翰·凯莱赫(John D. Kelleher).布伦丹·蒂尔尼(Brendan Tierney) 译者:张世武.黄元勋 来源:大数据D ...

最新文章

  1. How to deal with large number of threads in clients
  2. python renames_Python os.renames() 方法
  3. 定制ListView的界面(使用自定义的列表项布局,一边显示水果图片,一边显示水果文字)以及ListView的点击事件
  4. 北航计算机科学与技术专业培养计划,北京航空航天大学2020年计算机科学与技术专业培养计划...
  5. 用友致远协同OA办公软件可以给外驻领导带来什么好处?
  6. c盘扩展卷功能只能向右扩展_信用风险管理:功能扩展和选择
  7. wdk1703+vs2015编译的诡异问题
  8. win10 linux安卓模拟器,genymotion安卓模拟器在Window10中使用的问题
  9. C语言向文件写入内容并读取显示
  10. Java读取HTML传人文件,java读取html文件并获取body中所有的标签及内容的案例.pdf
  11. SpringSecurity Basic Authentication
  12. sea 配置资料收集
  13. sql无效字符 执行sql语句报错解决方案
  14. 又一次全球第一!| 凌云时刻
  15. Gamma矫正,先有鸡还是先有蛋的故事
  16. python3d坐标系转换_世界坐标系,相机坐标系和图像坐标系的转换(Python)
  17. html写小星星,写小星星的句子
  18. 免费领百度网盘会员,12月31日截止
  19. 【Git】Git修改 commit 的信息
  20. 练习- Java顺序结构综合练习二之温度换算

热门文章

  1. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
  2. linux wifi音箱,基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
  3. raw图各个格式之间的转换
  4. 润乾报表导出pdf问题
  5. [爬虫项目]猫眼电影TOP100
  6. python 根据身份证号计算年龄和性别_根据身份证自动计算出生日期、年龄、性别的例子...
  7. 挥发性有机物TVOC、VOC、VOCS气体检测+解决方案
  8. java 支付宝预下单失败,系统异常,预下单状态未知!!! connect timed out
  9. 信息学奥赛C++语言:什么时候开会
  10. IDC中国大型企业SaaS云服务市场:金蝶位居第一