kaggle----練手機(jī)器學(xué)習(xí)項(xiàng)目1---Taxi Time prediction

接下來按照原計(jì)劃,開始由易到難的打卡kaggle 機(jī)器學(xué)習(xí)項(xiàng)目

# coding: utf-8

# # 項(xiàng)目的背景
# 科技已經(jīng)改變交通
# 提供了一個(gè)城市一年20130701-20140630 的運(yùn)行軌跡的數(shù)據(jù)
# 
# trip_id: 每一個(gè)性成的標(biāo)識(shí)符號(hào)
# call_type: A 預(yù)定taxi的時(shí)候胰锌,電話打到 taxi 管理中心秃症,B電話接聽指定地點(diǎn)范圍內(nèi)的司機(jī)  C電話連接到隨機(jī)任意一個(gè)線路上
# origin call:當(dāng)call_type=A的時(shí)候抬纸,它標(biāo)識(shí)旅行的客戶先口,否則為空
# origin stand: call_type='B',標(biāo)識(shí)的是旅行的起點(diǎn)
# taxi_id:出租車司機(jī)的唯一標(biāo)識(shí)符號(hào)
# daytype:三種類型壮锻,B表示節(jié)假日樟澜,C表示節(jié)假日的前一天误窖,A則表示普通日,或者工作日
# missing_data:False 表示GPS經(jīng)緯度坐標(biāo)存在秩贰,反之?dāng)?shù)據(jù)丟失
# Polyline: 每15s行程的一對(duì)經(jīng)緯度坐標(biāo)
# 
# 本次比賽的總行程時(shí)間(本次比賽的預(yù)測目標(biāo))定義為(點(diǎn)數(shù)-1)×15秒霹俺。例如,在POLYLINE中包含101個(gè)數(shù)據(jù)點(diǎn)的行程長度為(101-1)* 15 = 1500秒毒费。有些trip在POLYLINE中缺少數(shù)據(jù)點(diǎn)(由MISSING_DATA列表示)丙唧,如何利用這些知識(shí)是一個(gè)挑戰(zhàn)。
# 
#  這是一個(gè)回歸問題觅玻,我們需要預(yù)測總共的時(shí)間想际,從出發(fā)到到達(dá)目的地
#  

# In[1]:


import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 
import datetime
from numpy import sqrt


from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error as mse
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import Ridge 
from sklearn.linear_model import Lasso 
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR 
from xgboost import XGBRegressor


# In[2]:


df=pd.read_csv(r'C:\\Users\\Lenovo\\Desktop\\hands-on-machine-learning\\ml of finding job\\train.csv')
df.head(10)
df.isnull().sum(axis=0)##origin call 和stand 的數(shù)據(jù)丟失比較嚴(yán)重,一般并不在車站或者通過打taxi 中心的電話約車


# In[16]:


df.info()#可以看到每一列的數(shù)據(jù)類型


# In[19]:


##當(dāng)數(shù)據(jù)類型為numeric 的時(shí)候溪厘,那么就會(huì)返回count,mean,std,min,胡本,1/4分位,1/2畸悬,3/4等侧甫,
"""
include 
來限定數(shù)據(jù)類型
object---categories,就是'a','b','c'等
"""
df.describe(include=['object'])#出現(xiàn)的不同值的數(shù)量,只出現(xiàn)一次的值的個(gè)數(shù)蹋宦,出現(xiàn)次數(shù)最高的是披粟,出現(xiàn)最高的值出現(xiàn)的次數(shù)

"""
結(jié)果顯示,關(guān)于出行時(shí)間
數(shù)據(jù)顯示都是在工作日
而且5901 沒法算其出行的時(shí)間
"""


# In[3]:


##將時(shí)間轉(zhuǎn)變?yōu)槟暝氯盏男问?學(xué)習(xí)fromtimesstamp的用法
df.sort_values(by='TIMESTAMP',axis=0,inplace=True)
df['year'] = df['TIMESTAMP'].apply(lambda x :datetime.datetime.fromtimestamp(x).year) 
df['month'] = df['TIMESTAMP'].apply(lambda x :datetime.datetime.fromtimestamp(x).month) 
df['month_day'] = df['TIMESTAMP'].apply(lambda x :datetime.datetime.fromtimestamp(x).day) 
df['hour'] = df['TIMESTAMP'].apply(lambda x :datetime.datetime.fromtimestamp(x).hour) 
df['week_day'] = df['TIMESTAMP'].apply(lambda x :datetime.datetime.fromtimestamp(x).weekday()) 
df.head(10)
type(df["year"].value_counts())# series類型
df['year'].value_counts().keys()#注意兩者連用


# In[36]:


##餅形圖
plt.figure(figsize=(10,10))
plt.pie(df["year"].value_counts(),labels=df["year"].value_counts().keys(),autopct='%.1f%%')
plt.show()#數(shù)據(jù)每年各占一半


# In[40]:


plt.figure(figsize=(5,5))
plt.title('count of trips of per day of week')
sns.countplot(x="week_day",data=df)#第一個(gè)參數(shù)為x,或者y,表示顯示在x軸上還是y軸上冷冗,是數(shù)據(jù)的列名守屉,data 為傳入的數(shù)據(jù)
#一般為dataFrame 類型
plt.xlabel("the day of week")
plt.ylabel("counts")
plt.show()


# In[41]:


plt.figure(figsize = (10,10))
plt.title('Count of trips per month')
sns.countplot(y = 'month', data = df)
plt.xlabel('Count')
plt.ylabel('Month')

##On an average we can say that every month has atleast 120000 taxi trips planned.


# In[42]:


plt.figure(figsize = (10,10))
plt.title('Count of trips per hour')
sns.countplot(x = 'hour', data = df)
plt.xlabel('Count')
plt.ylabel('Hours')


# In[4]:


##來看一下丟失的數(shù)據(jù)有多少
df["MISSING_DATA"].value_counts()
"""
10個(gè)數(shù)據(jù)丟失
"""
#將這些所在的行去掉
"""
關(guān)于 drop 的參數(shù)的使用
labels : single label or list-like
Index or column labels to drop.

axis : {0 or ‘index’, 1 or ‘columns’}, default 0
Whether to drop labels from the index (0 or ‘index’) or columns (1 or ‘columns’).

index : single label or list-like
Alternative to specifying axis (labels, axis=0 is equivalent to index=labels).#去除一些行,肯定用index 索引蒿辙,
或者label指定索引

New in version 0.21.0.

columns : single label or list-like
Alternative to specifying axis (labels, axis=1 is equivalent to columns=labels).
#去除一些列(一行中的某些字段)胸梆,肯定用列名 索引敦捧,
或者label指定列名

"""

df.drop(df[df["MISSING_DATA"]==True].index,axis=0,inplace=True)
df["MISSING_DATA"].unique()
df.drop(df[df["POLYLINE"]=='[]'].index,axis=0,inplace=True)
df["POLYLINE"].value_counts()


# In[8]:


##下面將形成換算成時(shí)間

df["polyline length"]=df["POLYLINE"].apply(lambda x :len(eval(x))-1)##一共列表中的有幾組數(shù)據(jù)
df["trip_time"]=df["polyline length"].apply(lambda x:x*15)
df.head(10)


# In[5]:


#one hot encoidng for call type 
df = pd.get_dummies(df, columns=['CALL_TYPE'])#先轉(zhuǎn)化,然后在和原來的表進(jìn)行連接,并不會(huì)影響行數(shù)碰镜,其實(shí)就是將一列的值轉(zhuǎn)化為多列
"""
Desktop/到的結(jié)果是增加了3列
CALL_TYPE_A,B,C 
CALL_TYPE_A ,對(duì)應(yīng)的三列值為【0兢卵,0,1】绪颖,B為【0秽荤,1,0】柠横,C為【1窃款,0,0】
"""
df.head(10)### 可以將非向量形式的object 轉(zhuǎn)化為向量形式便于研究


# In[7]:


df
"""
存在3個(gè)參數(shù)
subset 指定要去重的列名牍氛,列表的形式傳入晨继,比如['A','B'],就是表示 A,B兩類列重復(fù)的去掉,默認(rèn)為全部列
inplace 是否在原來的基礎(chǔ)上修改
keep first,last False 三個(gè)值搬俊,表示留下重復(fù)列的第一個(gè)紊扬,最后一個(gè),全部刪除
"""
df.head(10)


# In[6]:


####構(gòu)建機(jī)器學(xué)習(xí)模型
x=df[['polyline length','CALL_TYPE_A','CALL_TYPE_B','CALL_TYPE_C']]
y=df['trip_time']


# data standization

s=StandardScaler()
x=s.fit_transform(x)##采用的是z-score的方法唉擂,每一個(gè)參數(shù)減去其平均值 除以相應(yīng)的標(biāo)準(zhǔn)差

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)

print("The size of training input is", x_train.shape)
print("The size of training output is", y_train.shape)
print(50 *'*')
print("The size of testing input is", x_test.shape)
print("The size of testing output is", y_test.shape)
x_train



# In[31]:


#下面提供了集中預(yù)測模型


"""
第一種利用均值進(jìn)行預(yù)測
r2_score, 1-MSE/(實(shí)際值-平均值)^2 x 1/(樣本個(gè)數(shù)),值越接近于1餐屎,說明模型越好
"""

y_train_pred=np.ones(x_train.shape[0])*y_train.mean() #以平均值作為預(yù)測值,訓(xùn)練集的預(yù)測
y_test_pred=np.ones(x_train.shape[0])*y_test.mean() #以平均值作為預(yù)測值,測試集的預(yù)測

print("Train Results for Baseline Model:")
print(50 * '-')
print("root mean squared error as rmse", sqrt(mse(y_train.values,y_train_pred)))
print("R-squared: ", r2_score(y_train.values, y_train_pred))


# In[1]:


##knn 算法
"""
存在兩種分類請(qǐng)器玩祟,一種為 kneighborclassifier 原理如下
1)計(jì)算測試數(shù)據(jù)與各個(gè)訓(xùn)練數(shù)據(jù)之間的距離腹缩;

  2)按照距離的遞增關(guān)系進(jìn)行排序;

  3)選取距離最小的K個(gè)點(diǎn)空扎;(k的值藏鹊,采用GridSearchCV的交叉驗(yàn)證)

  4)確定前K個(gè)點(diǎn)所在類別的出現(xiàn)頻率;

  5)返回前K個(gè)點(diǎn)中出現(xiàn)頻率最高的類別作為測試數(shù)據(jù)的預(yù)測分類
  另外 一種為 kneighborregressor 主要思想:選取樣本的K個(gè)近鄰樣本转锈,用近鄰樣本的響應(yīng)值(y)的均值作為該樣本的預(yù)測值
  
  同樣的 也有 DecisionTreeRegressor,   SVM 中的SVR
  """


"""
GridSearchCV
可以一次性的限定預(yù)測模型以及打分標(biāo)準(zhǔn)(score 參數(shù))
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid=’warn’,
refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, 
error_score=’raise-deprecating’, return_train_score=False)
其中 param_grid 可以傳入一個(gè)列表或者字典
字典的話以參數(shù)為鍵名稱

KNeighborsRegressor(n_neighbors=5, weights=’uniform’, algorithm=’auto’, 
leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)
"""

k_range=list(range(1,30))
param=dict(n_neighbors=k_range)#以KNeighborsRegressor 的參數(shù) n_neighbors 為鍵名
knn_regressor=GridSearchCV(KNeighborsRegressor(),param,cv=10)
knn_regressor.fit(x_train,y_train)
print (knn_regressor.best_estimator_)
print(knn_regressor.best_params_)


# ## 交叉驗(yàn)證
# 
# <span class="mark">第一種是簡單交叉驗(yàn)證伙判,所謂的簡單,是和其他交叉驗(yàn)證方法相對(duì)而言的黑忱。首先宴抚,我們隨機(jī)的將樣本數(shù)據(jù)分為兩部分(比如: 70%的訓(xùn)練集,30%的測試集)甫煞,然后用訓(xùn)練集來訓(xùn)練模型菇曲,在測試集上驗(yàn)證模型及參數(shù)。接著抚吠,我們?cè)侔褬颖敬騺y常潮,重新選擇訓(xùn)練集和測試集,繼續(xù)訓(xùn)練數(shù)據(jù)和檢驗(yàn)?zāi)P涂ΑW詈笪覀冞x擇損失函數(shù)評(píng)估最優(yōu)的模型和參數(shù)喊式。</span> 
# 
#      <span class="burk">第二種是S折交叉驗(yàn)證(S-Folder Cross Validation)孵户。和第一種方法不同,S折交叉驗(yàn)證會(huì)把樣本數(shù)據(jù)隨機(jī)的分成S份岔留,每次隨機(jī)的選擇S-1份作為訓(xùn)練集夏哭,剩下的1份做測試集。當(dāng)這一輪完成后献联,重新隨機(jī)選擇S-1份來訓(xùn)練數(shù)據(jù)竖配。若干輪(小于S)之后,選擇損失函數(shù)評(píng)估最優(yōu)的模型和參數(shù)里逆。
# 
#     第三種是留一交叉驗(yàn)證(Leave-one-out Cross Validation)进胯,它是第二種情況的特例,此時(shí)S等于樣本數(shù)N原押,這樣對(duì)于N個(gè)樣本胁镐,每次選擇N-1個(gè)樣本來訓(xùn)練數(shù)據(jù),留一個(gè)樣本來驗(yàn)證模型預(yù)測的好壞诸衔。此方法主要用于樣本量非常少的情況盯漂,比如對(duì)于普通適中問題,N小于50時(shí)署隘,我一般采用留一交叉驗(yàn)證宠能。</span>

# In[ ]:


params ={'alpha' :[0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000]}
ridge_regressor =GridSearchCV(Ridge(), params ,cv =5,scoring = 'neg_mean_absolute_error', n_jobs =-1)
ridge_regressor.fit(X_train ,y_train)


y_train_pred =ridge_regressor.predict(X_train) ##Predict train result
y_test_pred =ridge_regressor.predict(X_test) ##Predict test result

print("Train Results for Ridge Regressor Model:")
print(50 * '-')
print("Root mean squared error: ", sqrt(mse(y_train.values, y_train_pred)))
print("R-squared: ", r2_score(y_train.values, y_train_pred))


# In[ ]:


##Lasso Regression 
params ={'alpha' :[0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000]}
lasso_regressor =GridSearchCV(Lasso(), params ,cv =15,scoring = 'neg_mean_absolute_error', n_jobs =-1)
lasso_regressor.fit(X_train ,y_train)
y_train_pred =lasso_regressor.predict(X_train) ##Predict train result
y_test_pred =lasso_regressor.predict(X_test) ##Predict test result


print("Train Results for Lasso Regressor Model:")
print(50 * '-')
print("Root mean squared error: ", sqrt(mse(y_train.values, y_train_pred)))
print("R-squared: ", r2_score(y_train.values, y_train_pred))


# In[ ]:


#Decision Tree Regression 
depth  =list(range(3,30))
param_grid =dict(max_depth =depth)
tree =GridSearchCV(DecisionTreeRegressor(),param_grid,cv =10)
tree.fit(X_train,y_train)

y_train_pred =tree.predict(X_train) ##Predict train result
y_test_pred =tree.predict(X_test) ##Predict test result


print("Train Results for Decision Tree Regressor Model:")
print(50 * '-')
print("Root mean squared error: ", sqrt(mse(y_train.values, y_train_pred)))
print("R-squared: ", r2_score(y_train.values, y_train_pred))


# In[ ]:


tuned_params = {'max_depth': [1, 2, 3, 4, 5], 'learning_rate': [0.01, 0.05, 0.1], 'n_estimators': [100, 200, 300, 400, 500], 'reg_lambda': [0.001, 0.1, 1.0, 10.0, 100.0]}
model = RandomizedSearchCV(XGBRegressor(), tuned_params, n_iter=20, scoring = 'neg_mean_absolute_error', cv=5, n_jobs=-1)
model.fit(X_train, y_train)
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

print("Train Results for XGBoost Regressor Model:")
print(50 * '-')
print("Root mean squared error: ", sqrt(mse(y_train.values, y_train_pred)))
print("R-squared: ", r2_score(y_train.values, y_train_pred))

數(shù)據(jù)下載及原項(xiàng)目地址:https://www.kaggle.com/akshaychavan123/taxi-trip-time-prediction
感興趣的朋友可以動(dòng)手去實(shí)現(xiàn)一下亚隙,這個(gè)項(xiàng)目也是入門級(jí)別的實(shí)操項(xiàng)目

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磁餐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阿弃,更是在濱河造成了極大的恐慌诊霹,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣淳,死亡現(xiàn)場離奇詭異脾还,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)入愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門鄙漏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棺蛛,你說我怎么就攤上這事怔蚌。” “怎么了旁赊?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵桦踊,是天一觀的道長。 經(jīng)常有香客問我终畅,道長籍胯,這世上最難降的妖魔是什么竟闪? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮杖狼,結(jié)果婚禮上炼蛤,老公的妹妹穿的比我還像新娘。我一直安慰自己本刽,他們只是感情好鲸湃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著子寓,像睡著了一般暗挑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斜友,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天炸裆,我揣著相機(jī)與錄音,去河邊找鬼鲜屏。 笑死烹看,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洛史。 我是一名探鬼主播惯殊,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼也殖!你這毒婦竟也來了土思?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤忆嗜,失蹤者是張志新(化名)和其女友劉穎己儒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捆毫,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闪湾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绩卤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片途样。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖濒憋,靈堂內(nèi)的尸體忽然破棺而出何暇,到底是詐尸還是另有隱情,我是刑警寧澤跋炕,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布赖晶,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遏插。R本人自食惡果不足惜捂贿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胳嘲。 院中可真熱鬧厂僧,春花似錦、人聲如沸了牛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹰祸。三九已至甫窟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛙婴,已是汗流浹背粗井。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留街图,地道東北人浇衬。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像餐济,于是被迫代替她去往敵國和親耘擂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 今天想梳理一下kaggles上面的項(xiàng)目,對(duì)于一些感興趣的,以后再仔細(xì)研究下 1絮姆、https://www.kaggl...
    南風(fēng)寄羽閱讀 2,990評(píng)論 0 4
  • 本周開始試了下高德的路徑規(guī)劃導(dǎo)航醉冤,雖然效果很差,但其中有一些借鑒意義滚朵,可以作為備選的特征放到后期的model中冤灾。例...
    HOHOOO閱讀 535評(píng)論 0 1
  • 各種機(jī)器學(xué)習(xí)的應(yīng)用場景分別是什么前域?例如辕近,k近鄰,貝葉斯,決策樹匿垄,svm移宅,邏輯斯蒂回歸和最大熵模型。 如何評(píng)價(jià)Pyt...
    hzyido閱讀 1,406評(píng)論 0 7
  • 谷歌 有兩個(gè)平臺(tái)提供免費(fèi)的云端 GPU : Colab 和 Kaggle 浅乔, 如果你想深入學(xué)習(xí)人工智能和深度學(xué)習(xí)技...
    IC全球購閱讀 14,293評(píng)論 0 5
  • 每當(dāng)回想起自己的高中時(shí)光,蘇珩總是覺得是模糊的,就像電視劇刻意營造的那些光影效果靖苇,許多明明沒有過去多久的事情席噩,卻已...
    鵲慕閱讀 274評(píng)論 0 1