0
点赞
收藏
分享

微信扫一扫

线性回归模型——以公共自行车租借为例

扬帆远航_df7c 2022-04-13 阅读 44

事件原因:

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

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

拟合结果

在这里插入图片描述

改进模型

如何对一个模型的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'] = 0

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

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

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

优化后的效果

在这里插入图片描述

总代码

import pandas as pd
import pylab as pl
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

data_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'] = 0


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

pl.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))
举报

相关推荐

0 条评论