机器学习——共享单车数据集预测


共享单车数据集可从这里下载
原始数据集地址: http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset
下载下来后,可以看到包含两个文件
在这里插入图片描述

数据简介

此数据集包含的是从 2011 年 1 月 1 日到 2012 年 12 月 31 日期间每天每小时的骑车人数。骑车用户分成临时用户和注册用户,cnt 列是骑车用户数汇总列。你可以在上方看到前几行数据。

下图展示的是数据集中前 10 天左右的骑车人数(某些天不一定是 24 个条目,所以不是精确的 10 天)。你可以在这里看到每小时租金。这些数据很复杂!周末的骑行人数少些,工作日上下班期间是骑行高峰期。我们还可以从上方的数据中看到温度、湿度和风速信息,所有这些信息都会影响骑行人数。你需要用你的模型展示所有这些数据。

加载数据集

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

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

在这里插入图片描述

字段说明

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)

数据集的基本信息

print(train.info())

在这里插入图片描述

分析数据集

查看数据各特征的分布,以及特征之间是否存在相关关系等冗余。
在Python中,有很多数据可视化途径。
Matplotlib非常强大,也很复杂,不易于学习。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,
大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。

## 各属性的统计特性;
# 观测数据,初步估测个特征分布:
# 1:searn--mean值在25%-59%分位数之间;特征方差均较小;
# 2:casual  registered  cnt为需要预测的y值(本实例只考虑cnt);
# 3.大部分特征均值在1/4-1/2分位数之间噪声值较少基本不存在;少数在1/2-3/4分位数之间噪声值存在;
data.describe()  

在这里插入图片描述

数据预处理

def Data_preprocessing():
    
    #对类别型特征,观察其取值范围及直方图
    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('独热编码结果')
    print(X_train_cat)



    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('数据归一化处理结果')
    print(X_train_num.head())


    # 合并数据
    X_train = pd.concat([X_train_cat, X_train_num, train['holiday'],  train['workingday']], axis = 1, ignore_index=False)
    print('X_train.head(): ')
    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.head())

    print(FE_train.info())

这里的数据预处理包括将特征数据转换为独热编码,数据归一化,合并数据等处理
独热编码的结果如下图:
在这里插入图片描述
数据归一化结果 :
在这里插入图片描述
数据合并前的数据head:
在这里插入图片描述
数据合并后的head:
在这里插入图片描述

训练数据集

import pandas as pd
import numpy as np
from bike 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))



#分别使用线性回归,岭回归,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()


R2:0.853814736719781
MSE:621746.8036719494
RMSE:590.9812536346216

分别使用线性回归,岭回归,Lasso回归进行数据预测的结果如下图所示:
在这里插入图片描述

  • 22
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值