機器學習 (十七)kaggle競賽之泰坦尼克號項目實戰-2

導航

       想寫這篇博客的由衷是做完幾個項目,有時對於圖的畫法和模型融合算法原理理解還很膚淺,特此加深一下印象。
內容概覽


  1. pandas、matplotlib、seaborn
    餅圖
    直方圖
  2. 融合方法
    bagging
    boosting
    stacking

pandas、matplotlib、seaborn關係

       matplotlib是python裏面最著名的繪圖系統,也即最牛逼的繪圖系統,seaborn也是封裝了matplotlib而成,類似於pandas封裝了numpy一樣,由此可以想到seaborn的易用性要比matplotlib好,語言都是越高級封裝越徹底的越好用。
       pandas的plot方式是一種簡寫方式,內部調用了plt.figure() add_subplot()等方法。
seaborn各種畫圖文檔:http://seaborn.pydata.org/examples/index.html

餅圖

       餅形圖只找到了pandas、matplotlib實現沒有找到seaborn實現,相對其他圖形餅形圖還是不常用一些。

survived_value_counts = train_data['Survived'].value_counts()
# # Series.plot 畫圖
survived_value_counts.plot.pie(labeldistance = 1.1,autopct = '%1.2f%%',
                                               shadow = False,startangle = 90,pctdistance = 0.6)

# matplotlib畫圖
labels = '0','1'
# 升序排序方便和labels對應
sizes = survived_value_counts.sort_index(ascending=True)
explode = (0,0.1) #1表示將存貨的概率凸現出來
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.2f%%',shadow=False,startangle=90)
plt.show()

模型融合

       集成學習通過構建並結合多個學習器來完成學習任務,如果集成學習器中只包含同類型的個體學習器,成爲“同質”集成,個體可成爲基學習器,反之爲異質集成,個體成爲組件學習器。
       根據個體學習器生成方式,將集成學習方法大致分爲兩類:
       個體學習器之間存在強依賴關係 在基於前面模型的訓練結果(誤差)生成新的模型,所以 必須串行的序列化方法(boosting)
不存在強依賴關係,可同時對樣本隨機採樣,並行生成個體學習器的方法(bagging)

       模型融合一般爲多個弱分類器融合,多個強分類器融合有時也能達到好的效果,提高泛化能力,但經常會減慢計算速度,好壞也不一定,一般是好壞一樣 結果不同的模型融合,所以常爲多個弱分類器融合爲強分類器

Bagging

       目的:對樣本、對特徵屬性分別隨機選取,產生多個獨立模型,然後綜合多個模型取值,旨在減少方差(variance)(投票法:絕對投票法(過半)、相對投票法、加權投票法)
爲什麼重採樣樣本?
       如果想要得到泛華能力強的集成,個體學習器應該儘可能的相互獨立,對訓練集重採用可以得到不同的訓練集,是從原始數據集(放回重複採樣)選擇S次後得到S個新數據集,將某個學習算法分別作用於每個數據集就得到了S個分類器,在對新數據分類時,選擇這S個分類器投票結果最多的類別當做最後類別,每次重新採樣避免了數據不均的影響因此可以降低整體的方差。
訓練過程如下圖,數據集爲D(x|y) , 進行m次隨機子抽樣得到m個大小爲n’的數據子集,分別在上面訓練成m個基學習器,再根據投票、加權等方式得出最終結果。
在這裏插入圖片描述
       熟悉了訓練流程看下訓練代碼,下面是隨機森林訓練模型,傳入訓練集數據和標籤,返回網格搜索對象。

# 基於bagging的隨機森林融合
def RFClassifier(titanic_train_data_X,titanic_train_data_Y):
    print(titanic_train_data_X.shape)
    # randomforest random_state隨機器對象 一般不變
    rf_est = RandomForestClassifier(random_state=0)
    # 網格搜索調優參數
    rf_param_grid = {'n_estimators':[50,100,200],'min_samples_split':[5,6,7],'max_depth':[10,15,20]}
    rf_grid = model_selection.GridSearchCV(rf_est,rf_param_grid,n_jobs=25,cv=10,verbose=1)
    rf_grid.fit(titanic_train_data_X,titanic_train_data_Y)
    print('Best RF Params:' + str(rf_grid.best_params_))
    print('Best RF Score:' + str(rf_grid.best_score_))
    print('RF Train Score:' + str(rf_grid.score(titanic_train_data_X,titanic_train_data_Y)))
    return rf_grid

# 隨機森林融合
rf_grid = RFClassifier(titanic_train_data_X,titanic_train_data_Y)
y_rf_test_pred = rf_grid.predict_proba(titanic_test_data_X)
print(y_rf_test_pred)

       random forest(RF)決策樹+bagging隨機森林是bagging的一個擴展,RF在以決策樹爲基學習器構建bagging集成基礎上,引入隨機的屬性選擇,即對於基決策樹進行劃分時,隨機從節點屬性集中選取一個包含k個屬性的子集,再從子集中選擇最優屬性劃分,k控制了隨機程度。

Boosting

       原理:個體學習器存在強依賴關係,在基於前面模型的訓練結果(誤差)生成新的模型,擬合前一個模型的誤差,旨在減少偏差(bias)。
       訓練過程 ,X0是原始數據集得來,第一個弱分類器訓練該訓練集 結果出來後,對分錯的樣本進行統計錯誤率或偏差,統計出來後提升這些樣本的權重值,得到X1訓練集,第二個弱分類器拿X1訓練集來訓練,如此類推直到第m個分類器,最後再綜合各個分類器結果出來最終預測結果,如下圖:

在這裏插入圖片描述

模型預測代碼如下:

# 基於boosting的隨機森林融合
def AdaBClassifier(titanic_train_data_X,titanic_train_data_Y):
    print(titanic_train_data_X.shape)
    # #AdaBoost
    ada_est = AdaBoostClassifier()
    ada_param_grid = {'n_estimators':[500],'learning_rate':[0.01,0.1]}
    ada_grid = model_selection.GridSearchCV(ada_est,ada_param_grid,n_jobs=25,cv=10,verbose=1)
    ada_grid.fit(titanic_train_data_X,titanic_train_data_Y)
    print('Best Ada Params:' + str(ada_grid.best_params_))
    print('Best Ada Score:' + str(ada_grid.best_score_))
    print('Ada Train Score:' + str(ada_grid.score(titanic_train_data_X,titanic_train_data_Y)))
    return ada_grid



# 基於boosting的GradientBoosting
def GBClassifier(titanic_train_data_X,titanic_train_data_Y):
    print(titanic_train_data_X.shape)
    # GradientBoosting
    gb_est = GradientBoostingClassifier(random_state=0)
    gb_param_grid = {'n_estimators':[500],'learning_rate':[0.01,0.1],'max_depth':[20]}
    gb_grid = model_selection.GridSearchCV(gb_est,gb_param_grid,n_jobs=25,cv=10,verbose=1)
    gb_grid.fit(titanic_train_data_X,titanic_train_data_Y)
    print('Best GB Params:' + str(gb_grid.best_params_))
    print('Best GB Score:' + str(gb_grid.best_score_))
    print('GB Train Score:' + str(gb_grid.score(titanic_train_data_X,titanic_train_data_Y)))
    return gb_grid


# Adaboost融合
ada_grid = AdaBClassifier(titanic_train_data_X,titanic_train_data_Y)
y_ada_test_pred = ada_grid.predict_proba(titanic_test_data_X)
print(y_ada_test_pred)

# GBClassifier融合
gb_grid = GBClassifier(titanic_train_data_X,titanic_train_data_Y)
y_gb_test_pred = gb_grid.predict_proba(titanic_test_data_X)
print(y_gb_test_pred)

後面我們將重點分析adaboost、xgboost等原理。

Stacking

       Stacking也是數據結構的一種,稱爲棧,它是一種有先後順序的結構,在這裏同樣有先後順序,數融合模型時表示一種分層模型集成框架。兩層模型應用最多,第一層由多個基學習器組成,其輸入爲原始訓練集,第二層的模型則是以第一層基學習器的輸出作爲訓練集進行再訓練,從而得到完整的stacking模型,第j個基模型對第i個訓練樣本的預測值將作爲新的訓練集中第i個樣本的第j個特徵值,也就是有幾個基模型就會有幾個特徵列作爲第二層的輸入特徵,訓練過程如下圖:
在這裏插入圖片描述

隨筆思考

如何實現拼寫糾錯呢
當我們在瀏覽器中輸入一個漢字或者單詞後,如果輸錯了之後就會彈出來最相近正確的單詞,這一過程如何實現呢。
首先我們有一個大的詞典作爲我們的語料庫,語料庫如何保存下來是一部分,保存在DB或者存爲字典,單詞去語料庫中查找可以確定是輸入錯了還是對了,確定對錯後既然就需要查找和這個輸入單詞最相近的單詞,這一過程可以利用編輯距離來度量,
有幾個問題需要思考一下:
如何度量各個單詞上下文之間的關係?
編輯距離如何通過動態規劃來求解?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章