kaggle(03)-自行車租賃預測問題(基礎版)

文章目錄

  • 問題描述:
  • 問題解決
    • 分析問題:
    • 解決問題
      • 第一步:讀取原始數據
      • 第二步:觀察原始數據
      • 第三步:原始數據的可視化
      • 第四步:數據的預處理
        • 時間屬性的分解
      • 第五步:數據的特征提取
        • 特征生成
        • 特征選擇
      • 第六步:訓練baseline
      • 第七步:模型的狀態估計(通過學習曲線)
      • 第八步:模型優化

問題描述:

  • 在對一個應用使用機器學習算法之前我們應該要分析清楚問題是什么
  • 本次項目所要解決的問題是:通過共享單車上的傳感器采集的數據和系統上記錄的用戶的行為數據,用來預測一年中不同時間段某個地區單車的使用情況,從而確定單車在該區域的投放數目,保證單車租賃公司的利益最大化。
  • 本項目中收集到的數據中包括:時間(年-月-日-時),季節(春夏秋冬),節日(是/否),工作日(是/否),天氣(四個等級),溫度,體感溫度,濕度,風速,非注冊人員租賃,注冊人員租賃,租賃人數;

問題解決

分析問題:

  • 從項目的描述來看,這是一個回歸問題,希望我們通過采集的數據去預測未來某段時間內單車的需求量。
  • 從采集的數據的屬性上可以猜測一些:
    • 工作日大家應該沒有時間去騎單車出去玩,節假日應該偏多
    • 溫度太低或者風速太大都不適合騎單車出去
    • 注冊的人員使用單車的頻率應該比非注冊的人員使用單車頻率高

解決問題

第一步:讀取原始數據

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#從本地磁盤讀取數據
df_train = pd.read_csv('kaggle_bike_competition_train.csv',header = 0)  
df_train.head(10)  #查看前10項內容

在這里插入圖片描述

通過查看原始數據發現,datatime這一項數據包括了年月日時分秒,后續可以將其拆分開來。雖然將數據打印出來,但是這樣的方式不太直觀,我們可以通過調用df.info()和df.describe()函數查看數據的統計信息。

第二步:觀察原始數據

df_train.dtypes  #查看數據中每行的屬性值

在這里插入圖片描述

可以看出數據中大部分都是數值型的數據,只有datatime是類別型的數據。

df_train.info()

在這里插入圖片描述

數據的完整性非常好。所有屬性的數據都沒有缺失值,那么接下我們看一下數值型數據的取值范圍吧!

df_train.describe()

在這里插入圖片描述

數據中的數值型數據的取值范圍相差不大,每個屬性內部的取值范圍也不大,所以覺得對數據做縮放意義不大。接下來我們通過可視化看看每個屬性與預測值之間的關系吧!

第三步:原始數據的可視化

# 風速
df_train_origin.groupby('windspeed').mean().plot(y='count', marker='o')  #畫出風速和租車次數的關系
plt.show()

在這里插入圖片描述

圖中的結果似乎與我們一開始的猜測有些出入,尤其是圖中風速大于50后,單車租賃次數反而劇增,這是一個比較特別的地方,后面可以著重考慮

# 濕度
df_train_origin.groupby('humidity').mean().plot(y='count', marker='o')  #畫出濕度值與租車次數的關系
plt.show()

在這里插入圖片描述

從圖中可以看出過干和過濕都會導致單車租賃的減少。

# 溫度
df_train_origin.groupby('temp').mean().plot(y='count', marker='o')  #畫出溫度與租車次數的關系
plt.show()

在這里插入圖片描述

從圖中的結構似乎可以看出隨著溫度的升高,單車租賃次數也越多,這是符合我們之前的猜測的。

#溫度濕度變化
df_train_origin.plot(x='temp', y='humidity', kind='scatter')
plt.show()

無法看出任何規律,只能說該地區的溫度和濕度的一個分布范圍。

# scatter一下各個維度
fig, axs = plt.subplots(2, 3, sharey=True)
df_train_origin.plot(kind='scatter', x='temp', y='count', ax=axs[0, 0], figsize=(16, 8), color='magenta')
df_train_origin.plot(kind='scatter', x='atemp', y='count', ax=axs[0, 1], color='cyan')
df_train_origin.plot(kind='scatter', x='humidity', y='count', ax=axs[0, 2], color='red')
df_train_origin.plot(kind='scatter', x='windspeed', y='count', ax=axs[1, 0], color='yellow')
df_train_origin.plot(kind='scatter', x='month', y='count', ax=axs[1, 1], color='blue')
df_train_origin.plot(kind='scatter', x='hour', y='count', ax=axs[1, 2], color='green')

在這里插入圖片描述

從圖中結果似乎只能看出溫度,體感溫度和租車次數呈現一定的正相關,風速與租車次數是負相關

# scatter一下各個維度
sns.pairplot(df_train_origin[["temp", "month", "humidity", "count"]], hue="count")

在這里插入圖片描述

各個屬性之間的相關性不是很強。

# 來看看相關度咯
corr = df_train_origin[['temp','weather','windspeed','day', 'month', 'hour','count']].corr()
corr

在這里插入圖片描述

似乎這樣比上面的圖像的結果理解起來更加方便,從表格的結果可知:溫度和小時與汽車租賃的相關性最大。

第四步:數據的預處理

由于原始數據不存在缺失值,類別屬性特征也較少,數值型數據比較規范,所以不需要太多的數據預處理,只需要對時間屬性進行處理進行。

時間屬性的分解

# 把月、日、和 小時單獨拎出來,放到3列中
df_train['month'] = pd.DatetimeIndex(df_train.datetime).month
df_train['day'] = pd.DatetimeIndex(df_train.datetime).dayofweek
df_train['hour'] = pd.DatetimeIndex(df_train.datetime).hour
# 再看
df_train.head(10)

在這里插入圖片描述

# 那個,保險起見,咱們還是先存一下吧
df_train_origin = df_train
# 拋掉不要的字段
df_train = df_train.drop(['datetime','casual','registered'], axis = 1)  #刪除'datetime','casual','registered'等列的數據
# 看一眼
df_train.head(5)

在這里插入圖片描述

# 得到X和Y
df_train_target = df_train['count'].values
df_train_data = df_train.drop(['count'],axis = 1).values
print 'df_train_data shape is ', df_train_data.shape
print 'df_train_target shape is ', df_train_target.shape

df_train_data shape is (10886L, 11L)
df_train_target shape is (10886L,)

第五步:數據的特征提取

特征生成

由于原始戶數比較規范,暫時先不做特征生成

特征選擇

由于數據比較規范,暫時不做特征選擇

第六步:訓練baseline

from sklearn import linear_model
from sklearn import cross_validation
from sklearn import svm
from sklearn.ensemble import RandomForestRegressor
from sklearn.learning_curve import learning_curve
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import explained_variance_score# 總得切分一下數據咯(訓練集和測試集)
cv = cross_validation.ShuffleSplit(len(df_train_data), n_iter=3, test_size=0.2,random_state=0)  #使用3折交叉驗證的方法# 各種模型來一圈print "嶺回歸"    
for train, test in cv:    svc = linear_model.Ridge().fit(df_train_data[train], df_train_target[train])print("train score: {0:.3f}, test score: {1:.3f}\n".format(svc.score(df_train_data[train], df_train_target[train]), svc.score(df_train_data[test], df_train_target[test])))print "支持向量回歸/SVR(kernel='rbf',C=10,gamma=.001)"
for train, test in cv:svc = svm.SVR(kernel ='rbf', C = 10, gamma = .001).fit(df_train_data[train], df_train_target[train])print("train score: {0:.3f}, test score: {1:.3f}\n".format(svc.score(df_train_data[train], df_train_target[train]), svc.score(df_train_data[test], df_train_target[test])))print "隨機森林回歸/Random Forest(n_estimators = 100)"    
for train, test in cv:    svc = RandomForestRegressor(n_estimators = 100).fit(df_train_data[train], df_train_target[train])print("train score: {0:.3f}, test score: {1:.3f}\n".format(svc.score(df_train_data[train], df_train_target[train]), svc.score(df_train_data[test], df_train_target[test])))

在這里插入圖片描述

上面簡單的比較了幾種常用的回歸算法在數據集上的表現,從實驗的結果可以看出,隨機森林的結果是最佳的。

第七步:模型的狀態估計(通過學習曲線)

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):plt.figure()plt.title(title)if ylim is not None:plt.ylim(*ylim)plt.xlabel("Training examples")plt.ylabel("Score")train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)train_scores_mean = np.mean(train_scores, axis=1)train_scores_std = np.std(train_scores, axis=1)test_scores_mean = np.mean(test_scores, axis=1)test_scores_std = np.std(test_scores, axis=1)plt.grid()plt.fill_between(train_sizes, train_scores_mean - train_scores_std,train_scores_mean + train_scores_std, alpha=0.1,color="r")plt.fill_between(train_sizes, test_scores_mean - test_scores_std,test_scores_mean + test_scores_std, alpha=0.1, color="g")plt.plot(train_sizes, train_scores_mean, 'o-', color="r",label="Training score")plt.plot(train_sizes, test_scores_mean, 'o-', color="g",label="Cross-validation score")plt.legend(loc="best")return plttitle = "Learning Curves (Random Forest, n_estimators = 100)"
cv = cross_validation.ShuffleSplit(df_train_data.shape[0], n_iter=10,test_size=0.2, random_state=0)
estimator = RandomForestRegressor(n_estimators = 100)
plot_learning_curve(estimator, title, X, y, (0.0, 1.01), cv=cv, n_jobs=4)plt.show()

在這里插入圖片描述

從圖中的結果可以看出,模型處于過擬合狀態

第八步:模型優化

從上面的記過可以看出,模型處于過擬合狀態,可以從模型的參數,特征兩方面來解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二叉樹序列化/反序列化

二叉樹被記錄成文件的過程,為二叉樹的序列化 通過文件重新建立原來的二叉樹的過程,為二叉樹的反序列化 設計方案并實現。 (已知結點類型為32位整型) 思路:先序遍歷實現。 因為要寫入文件,我們要把二叉樹…

機器學習總結(17)-XGBoost

文章目錄lecture17:XGBoost(eXtreme Gradient Boosting)目錄1. XGBoost的基本信息2. XGBoost與GBDT的異同點3. XGBoost的原理3.1定義樹的復雜度3.2 分裂節點3.3 自定義損失函數4. XGBoost的使用lecture17:XGBoost(eXtreme Gradient Boosting) 目錄 1. …

C++基礎學習(01)--(介紹,環境配置,基本語法,注釋)

文章目錄目錄一. c介紹二. c開發環境到的配置三. c基本語法四. c注釋目錄 一. c介紹 C 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言,支持過程化編程、面向對象編程和泛型編程。 C 被認為是一種中級語言,它綜合了高級語言和低…

《Head First設計模式》讀書筆記_第一章

策略模式 例:設計一個模擬鴨子游戲,游戲中有各種鴨子,一邊戲水一邊嘎嘎叫。 所以學習設計模式前,我們最先想到的就是設置一個超類,并讓其他子類去繼承這個類,UML圖如下: * * 但是&#xff0…

根據數組建立平衡二叉搜索樹

它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉(搜索)樹。 二分:用有序數組中中間的數生成搜索二叉樹的頭節點,然后對數組的左右部分分別生成左右子樹即可(重復…

C++基礎學習(02)--(數據類型,變量類型,變量作用域,常量,修飾符類型)

文章目錄目錄一. 數據類型C 中的數據類型typedefenumeration枚舉類型c中變量類型二.變量作用域三.常量四.修飾符類型目錄 一. 數據類型 C 中的數據類型 使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著&a…

commons-lang常用方法

maven引入 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency> 跟java.lang這個包的作用類似&#xff0c;Commons Lang這一組API也是提供一些基…

c++基礎學習(03)--(存儲類,運算符,循環,判斷)

文章目錄目錄一.存儲類二.運算符三.循環whilefor四.判斷目錄 一.存儲類 可見static存儲類修飾之后&#xff0c;i的值沒有從頭開始&#xff0c;而是從上一次的結果中保留下來 #include <iostream>using namespace std; class Data { public:Data(){}~Data(){}void show()…

皇后問題

八皇后問題是一個以國際象棋為背景的問題&#xff1a;如何能夠在 88 的國際象棋棋盤上放置八個皇后&#xff0c;使得任何一個皇后都無法直接吃掉其他的皇后&#xff1f;為了達到此目的&#xff0c;任兩個皇后都不能處于同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的…

c++基礎學習(04)--(函數、數字、數組、字符串)

文章目錄目錄1.函數2.數字3.字符串4.數組目錄 1.函數 #include <iostream> #include <limits>using namespace std;void swap(int *x , int *y);int main(){int a 100 , b200;cout<<"交換前:"<<"a is :"<<a<<"…

【精品計劃0】藍橋杯 摔手機

原題描述&#xff1a; x星球的居民脾氣不太好&#xff0c;但好在他們生氣的時候唯一的異常舉動是&#xff1a;摔手機。 各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試&#xff0c;并且評定出一個耐摔指數來&#xff0c;之后才允許上市流通。 …

數據結構課上筆記15

圖的存儲 多重鏈表&#xff1a;完全模擬圖的樣子&#xff0c;每個節點內的指針都指向該指向的節點。 節點結構內指針數為度 缺點&#xff1a;浪費空間、不容易操作 數組表示法&#xff08;鄰接矩陣表示法&#xff09; 可用兩個數組存儲。其中一個 一維數組存儲數據元素&#…

c++基礎學習(05)--(指針,引用)

文章目錄目錄1.指針2.引用目錄 1.指針 #include <iostream>using namespace std;int main () {int var1;char var2[10];cout << "var1 變量的地址&#xff1a; ";cout << &var1 << endl;cout << "var2 變量的地址&#xff…

由旅行商問題認識何為狀態壓縮

動態規劃 動態規劃(dynamic programming)是運籌學的一個分支&#xff0c;是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優化問題時&#xff0c;提出了著名的最優化原理(pri…

c++基礎學習(06)--(時間,輸入輸出,數據結構)

文章目錄目錄1.時間2.輸入輸出數據結構目錄 1.時間 當前日期和時間 下面的實例獲取當前系統的日期和時間&#xff0c;包括本地時間和協調世界時&#xff08;UTC&#xff09;。 #include <iostream> #include <ctime>using namespace std;int main( ) {// 基于當前…

Abstract Self-Balancing Binary Search Tree

二叉搜索樹 二叉查找樹&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索樹&#xff0c;二叉排序樹&#xff09;它或者是一棵空樹&#xff0c;或者是具有下列性質的二叉樹&#xff1a; 若它的左子樹不空&#xff0c;則左子樹上所有結…

AVL Tree

前言 希望讀者 了解二叉搜索樹 了解左旋右旋基本操作 https://blog.csdn.net/hebtu666/article/details/84992363 直觀感受直接到文章底部&#xff0c;有正確的調整策略動畫&#xff0c;自行操作。 二叉搜索樹 二叉查找樹&#xff08;Binary Search Tree&#xff09;&a…

c++基礎學習(07)--(類)

文章目錄目錄類與對象1.類成員函數2.類訪問修飾符3.構造函數與析構函數4.拷貝構造函數5. 友元函數6.內聯函數7.this指針8.指向類的指針9.類的靜態成員目錄 類與對象 #include <iostream>using namespace std;class Box {public:double length; // 長度double breadth;…

【大總結1】數據結構與傳統算法總結

由于時間和水平有限&#xff0c;肯定有錯誤或者寫得不好的地方 歡迎在文章下評論指出。 涉及語言&#xff1a; py3&#xff1a;注重算法本身的知識 c/c&#xff1a;實現基礎數據結構和算法 java&#xff1a;實現較復雜數據結構 一、概述 c語言知識體系 算法體系參考 課上筆…

c++基礎學習(08)--(繼承、重載、多態、虛函數)

文章目錄目錄1.繼承2.重載3.多態 && 虛函數目錄 1.繼承 #include <iostream>using namespace std;// 基類 class Shape {public:void setWidth(int w){width w;}void setHeight(int h){height h;}protected:int width;int height; };// 派生類 class Rectang…