1 Star 2 Fork 0

黄捷洲 / 第四周作业

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

第四周作业 共享单车骑行数据预测

任务说明

1、 任务描述 请在Capital Bikeshare (美国Washington, D.C.的一个共享单车公司)提供的自行车数据上进行回归分析。根据每天的天气信息,预测该天的单车共享骑行量。

原始数据集地址:http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset 1) 文件说明 day.csv: 按天计的单车共享次数(作业只需使用该文件) hour.csv: 按小时计的单车共享次数(无需理会) readme:数据说明文件

  1. 字段说明 Instant记录号 Dteday:日期 Season:季节(1=春天、2=夏天、3=秋天、4=冬天) yr:年份,(0: 2011, 1:2012) mnth:月份( 1 to 12) hr:小时 (0 to 23) (只在hour.csv有,作业忽略此字段) holiday:是否是节假日 weekday:星期中的哪天,取值为0~6 workingday:是否工作日 1=工作日 (是否为工作日,1为工作日,0为非周末或节假日 weathersit:天气(1:晴天,多云
2:雾天,阴天
3:小雪,小雨
4:大雨,大雪,大雾) temp:气温摄氏度 atemp:体感温度 hum:湿度 windspeed:风速 casual:非注册用户个数 registered:注册用户个数 cnt:给定日期(天)时间(每小时)总租车人数,响应变量y (cnt = casual + registered)

casual、registered和cnt三个特征均为要预测的y,作业里只需对cnt进行预测

第一步 数据探索

做机器学习预测,我们拿到数据之后的第一步是查看数据,查看数据由很多种方法,下面简单介绍:

首先使用pd.read_csv函数读入数据

# 数据读取及基本处理
import pandas as pd
import numpy as np

# 读入数据
train = pd.read_csv("day.csv")
print(train.head())
#print("train : " + str(train.shape))

我们可以看到数据的前5页,大概看一下数据的结构

输入图片说明

使用:

print(train.info())

我们可以看到数据的总体信息

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 731 entries, 0 to 730
Data columns (total 16 columns):
instant       731 non-null int64
dteday        731 non-null object
season        731 non-null int64
yr            731 non-null int64
mnth          731 non-null int64
holiday       731 non-null int64
weekday       731 non-null int64
workingday    731 non-null int64
weathersit    731 non-null int64
temp          731 non-null float64
atemp         731 non-null float64
hum           731 non-null float64
windspeed     731 non-null float64
casual        731 non-null int64
registered    731 non-null int64
cnt           731 non-null int64
dtypes: float64(4), int64(11), object(1)
memory usage: 91.4+ KB

观察数据的统计信息:

#对数据值型特征,用常用统计量观察其分布
print(train.describe())

输入图片说明

第二步 数据预处理

对于数据可以分为两类,一类是数值型数据,一类是类别型数据;也就是连续数据和离散型数据,这两种数据需要分开处理

类别型数据:

对于类别型数据需要进行独热编码

#对类别型特征,观察其取值范围及直方图
categorical_features = ['season','mnth','weathersit','weekday']

#数据类型变为object,才能被get_dummies处理
for col in categorical_features:
    train[col] = train[col].astype('object')
    
X_train_cat = train[categorical_features]
X_train_cat = pd.get_dummies(X_train_cat)
print(X_train_cat)

运行结果为:

   season_1  season_2  season_3  ...  weekday_4  weekday_5  weekday_6
0         1         0         0  ...          0          0          1
1         1         0         0  ...          0          0          0
2         1         0         0  ...          0          0          0
3         1         0         0  ...          0          0          0
4         1         0         0  ...          0          0          0

[5 rows x 26 columns]

数值型数据

对于数值型数据进行归一化处理

 #数值型变量预处理,
    from sklearn.preprocessing import MinMaxScaler
    mn_X = MinMaxScaler()
    numerical_features = ['temp','atemp','hum','windspeed']
    temp = mn_X.fit_transform(train[numerical_features])
    X_train_num = pd.DataFrame(data=temp, columns=numerical_features, index =train.index)
    print(X_train_num.head())

得到的结果为:

       temp     atemp       hum  windspeed
0  0.355170  0.373517  0.828620   0.284606
1  0.379232  0.360541  0.715771   0.466215
2  0.171000  0.144830  0.449638   0.465740
3  0.175530  0.174649  0.607131   0.284297
4  0.209120  0.197158  0.449313   0.339143

合并数据

对于以上两个数据需要进行合并,然后存入文件“FE_day.csv”

# 合并数据
    X_train = pd.concat([X_train_cat, X_train_num, train['holiday'],  train['workingday']], axis = 1, ignore_index=False)
    #print(X_train.head())

    # 合并数据
    FE_train = pd.concat([train['instant'], X_train,  train['yr'],train['cnt']], axis = 1)
    FE_train.to_csv('FE_day.csv', index=False) #保存数据
    #print(FE_train.head())

    print(FE_train.info())

第三步 训练模型

如下程序为导入数据训练模型:

import pandas as pd
import numpy as np
from test_bick import  Data_preprocessing
from sklearn.model_selection import train_test_split
import os

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import RidgeCV
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet

from sklearn.metrics import r2_score#R square
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差

import matplotlib.pyplot as plt


def load_data():#导入数据
    global x_data,y_data,name_data

    if not os.path.isfile("FE_day.csv"):#调用已经做好特征工程的文件,如果文件不存在,就调用函数生成该文件
        Data_preprocessing()
        
    data = pd.read_csv("FE_day.csv")

    data = data.drop(['instant','hum','windspeed'], axis = 1)#去掉编号、湿度、风速等不相关数据
##    print(data)
    
    y_data = data['cnt']
    x_data = data.drop('cnt', axis = 1)

    y_data=np.array(y_data)
    x_data=np.array(x_data)
    name_data =list(data.columns)#返回对象列索引

##    print(x_data)
##    print(y_data)
##    print(name_data)
def traintestsplit():#数据分割,一部分用于验证、一部分用于训练
    global x_data,y_data,name_data

    X_train,X_test,y_train,y_test=train_test_split(x_data,y_data,random_state=0,test_size=0.20)#分割数据,20%用于测试,80%用于训练

    return X_train,X_test,y_train,y_test

load_data() #数据导入
X_train,X_test,y_train,y_test=traintestsplit()  #数据分割

#使用线性回归模型LinearRegression对数据进行训练及预测

#lr=LinearRegression()#最小二乘线性回归模型

#lr=Ridge()#岭回归模型

#lr=RidgeCV()#

lr=Lasso()#Lasso模型

#lr=ElasticNet()

#使用训练数据进行参数估计
lr.fit(X_train,y_train) #训练模型

#R2评价指标
lr_y_predict=lr.predict(X_test)
score = r2_score(y_test, lr_y_predict)
print("R2:{}".format(score))

#MSE评价指标
mse_test=mean_squared_error(y_test,lr_y_predict)
print("MSE:{}".format(mse_test))

#RMSE评价指标
Rmse_test=mean_absolute_error(y_test,lr_y_predict)
print("RMSE:{}".format(Rmse_test))

导入处理好的数据集

def load_data():#导入数据
    global x_data,y_data,name_data

    if not os.path.isfile("FE_day.csv"):#调用已经做好特征工程的文件,如果文件不存在,就调用函数生成该文件
        Data_preprocessing()
        
    data = pd.read_csv("FE_day.csv")

    data = data.drop(['instant','hum','windspeed'], axis = 1)#去掉编号、湿度、风速等不相关数据
##    print(data)
    
    y_data = data['cnt']
    x_data = data.drop('cnt', axis = 1)

    y_data=np.array(y_data)
    x_data=np.array(x_data)
    name_data =list(data.columns)#返回对象列索引

对导入的数据集进行分割,一部分用于训练,一部分用于测试

def traintestsplit():#数据分割,一部分用于验证、一部分用于训练
    global x_data,y_data,name_data

    X_train,X_test,y_train,y_test=train_test_split(x_data,y_data,random_state=0,test_size=0.20)#分割数据,20%用于测试,80%用于训练

    return X_train,X_test,y_train,y_test

使用最小二乘线性回归模型、岭回归模型、Lasso模型训练数据集,并使用MSE、RMSE、R2评价模型

#使用线性回归模型LinearRegression对数据进行训练及预测

#lr=LinearRegression()#最小二乘线性回归模型

#lr=Ridge()#岭回归模型

#lr=RidgeCV()#

lr=Lasso()#Lasso模型

#lr=ElasticNet()

#使用训练数据进行参数估计
lr.fit(X_train,y_train) #训练模型

#R2评价指标
lr_y_predict=lr.predict(X_test)
score = r2_score(y_test, lr_y_predict)
print("R2:{}".format(score))

#MSE评价指标
mse_test=mean_squared_error(y_test,lr_y_predict)
print("MSE:{}".format(mse_test))

#RMSE评价指标
Rmse_test=mean_absolute_error(y_test,lr_y_predict)
print("RMSE:{}".format(Rmse_test))

得到结果为:

最小二乘线性回归模型

R2:0.8539847000931238
MSE:621023.925170068
RMSE:594.6054421768707

岭回归模型

R2:0.854636684725367
MSE:618250.9414092939
RMSE:589.2949841711451

Lasso模型训练数据集

R2:0.853814736719781
MSE:621746.8036719494
RMSE:590.9812536346217

模型解析

根据以上模型评价参数发现,各回归模型的差异不大,均能达到85%左右的准确率,模型已经可以用于预测。

参看各模型的coef_分布:

输入图片说明

#分别使用线性回归,岭回归,Lasso回归进行数据预测
lrg=LinearRegression()
ridge=Ridge()
lasso=Lasso()
lrg.fit(X_train,y_train)
ridge.fit(X_train,y_train)
lasso.fit(X_train,y_train)

#数据视图,此处获取各个算法的训练数据的coef_:系数,coef_可以理解为系数

plt.figure(figsize=(12,9))


#线性回归 得到的coef
axes=plt.subplot(221)
axes.plot(lrg.coef_)
axes.set_title('lrg_coef')

#l岭回归 得到的coef
axes=plt.subplot(222)
axes.plot(ridge.coef_)
axes.set_title('ridge_coef')

#lasso回归 得到的coef
axes=plt.subplot(223)
axes.plot(lasso.coef_)
axes.set_title('lasso_coef')

plt.show()

空文件

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/huangjiezhou/fourth_week_homework.git
git@gitee.com:huangjiezhou/fourth_week_homework.git
huangjiezhou
fourth_week_homework
第四周作业
master

搜索帮助