机器学习入门04 您所在的位置:网站首页 bikebike自行车是什么歌 机器学习入门04

机器学习入门04

#机器学习入门04| 来源: 网络整理| 查看: 265

共享单车骑行数据预测 任务说明

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

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

字段说明 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())

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

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

项目源代码:共享单车数据预测



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有