代码拉取完成,页面将自动刷新
1、 任务描述 请在Capital Bikeshare (美国Washington, D.C.的一个共享单车公司)提供的自行车数据上进行回归分析。根据每天的天气信息,预测该天的单车共享骑行量。
原始数据集地址:http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset 1) 文件说明 day.csv: 按天计的单车共享次数(作业只需使用该文件) hour.csv: 按小时计的单车共享次数(无需理会) readme:数据说明文件
casual、registered和cnt三个特征均为要预测的y,作业里只需对cnt进行预测
做机器学习预测,我们拿到数据之后的第一步是查看数据,查看数据由很多种方法,下面简单介绍:
# 数据读取及基本处理
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
#使用线性回归模型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
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()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。