實戰|利用機器學習解決一個多分類任務

2021-02-13 小詹學Python

        ↑ "小詹學Python"一個值得星標的公眾號

                       

       本文約3000字,閱讀大概需要10分鐘

對於機器學習而言,如果你已經大致了解了相關算法的原理、理論推導,你也不是大家口中剛入門的小白了。接下來你需要將自己所學的知識利用起來,最好的方式應該就是獨立完成幾個項目實戰,項目難度入門級即可,因為重點是幫助你了解一個項目的流程,比如缺失值和異常值的處理、特徵降維、變量轉換等等。Kaggle毋庸置疑是一個很好的平臺,裡面的鐵達尼號、房屋價格預測、手寫數字都是非常非常經典的入門實戰項目,如果你獨立完成這三個項目後感覺可以提升一下難度,就可以繼續在Playground中尋找適合自己的項目。但如果你感覺還需要幾個簡單的項目鞏固一下,這裡給大家安利一下SofaSofa競賽平臺。專業程度雖然不及Kaggle,但練習賽中十個簡單項目用來練手還是不錯的,種類也是非常全的,包括分類、回歸預測、自然語言處理、圖像識別等等,本文在練習賽【8】——地震後建築修復建議的基礎上實現。
了解數據集首先一定要做的是了解數據集,因為大多數據集的特徵名都是以英文或者以英文簡寫搭配命名,只有真正了解一個特徵的意義,才能更好地分析該特徵與標籤變量之前存在的關係。SofaSofa在每個競賽中都會有一個表格,給出所有變量對應的解釋。可以看到這個數據集的特徵並不是很多,但訓練集共有65萬個樣本,我們都知道數據多對於建模是有好處的,因為數據越多覆蓋面就越廣,會提高模型的準確率,當然這可能會犧牲一些內存和計算時間。標籤變量y,共有四種可能取值,說明這是一個多元分類問題。
沒有缺失值是不錯的消息,除標籤變量y之外,共有9個數值型比變量和5個類別型變量。
可視化分析可視化分析一方面是幫助我們找出樣本中的異常點和離群點,一方面也是幫助分析特徵與標籤變量之間的關係。但上面提及了這個訓練集足足有65萬條數據,如果同時利用所有樣本繪製圖像,圖像可能會被樣本點填滿,很難從中得出有用的信息。所以這裡可以選擇隨機抽樣的方式,每次抽取1000-2000個樣本繪製圖像進行分析,可以多抽取幾次,防止數據的偶然性。這裡選擇用散點圖可視化數值型特徵,用area和age為例。area特徵中有一些數值偏大,但不能說其是異常點,因為一些大型建築物佔地面積3000不是不可能的,但2000個樣本,僅有不到20個樣本的佔地面積大於1500,所以可以將其視為離群點,離群點在建模時是會影響擬合的,所以選擇捨去。
對於建築物的年限age而言,可視化後會發現有很多樣本在age這一特徵的數值都為999,中間卻有很大的空缺,比如沒有一個樣本點的age位於500-900之間,所以這類樣本被視為異常點,再結合離群點分析,可以選擇一個閾值進行過濾。其他數值型特徵可以做同樣的操作,這裡不再過多介紹。
這個數據集還有個奇怪的地方就是有很多樣本地震後的樓層、高度都要高於地震發生之前,這顯然是不可能發生的,可能是在數據填充時出現了錯誤,利用布爾索引過濾掉此類特徵。
#布爾索引
data1 = data1[data1['floors_before']>=data1['floors_after']]
data1 = data1[data1['height_before']>=data1['height_after']]
data1.reset_index(drop = True)#重置索引

然後利用相關矩陣對所有的數值型特徵進行一下相關性分析,通過觀察相關性捨去一些沒有必要的特徵達到降維的目的。這裡"district_id"和"area_id"是完全相關的,可以隨便留下一個,或者都刪去,因為相關性確實小的可憐;可以看到這裡增加了兩個新的變量"floors_diff"和"height_diff",就是地震前後的建築物層數和高度的差值,可以觀察一下標籤變量"y"和這六個屬性的相關性,與地震前的信息相關性極低,也就是說,標籤變量很少關注一個建築物震前的信息,而是著重關注經過地震之後建築發生變化的信息。
類別型變量轉換類別型變量不方便後期建模時傳入數據,所以我們需要提前將類別型變量轉換為算法能識別的數值型,變量轉換方式有很多種,比如有序變量、啞變量、虛擬變量。對於"position"這一特徵,可以進行有序變量,由於僅有一個特徵,所以沒有調用sklearn中的API,而是直接利用自定義函數結合apply函數進行轉換。
def pos(e):
    if e == "Not attached":
        return 0
    elif e == "Attached-1 side":
        return 1
    elif e=="Attached-2 side":
        return 2
    else:
        return 3
data1['position'] = data1['position'].apply(pos)

而剩下的幾個類別型變量皆為無序變量,可以將其轉化為啞變量,再進一步轉化為虛擬變量。相比於sklearn中的API,pandas自帶的方法看起來更加簡潔。
#啞變量編碼
dummy_df = pd.get_dummies(data1.iloc[:,6:10])

如果你感覺這種方式簡單,並沒有懂啞變量編碼的意思和過程,可以試著了解一下下面這個函數,同樣是實現啞變量編碼。
def dummy_code(var):
    #獲取特徵中所有變量
    var_unique = var.unique()
    #新建一個DataFrame
    dummy = pd.DataFrame()
    for val in var_unique:
        #利用一個布爾型數組存儲編碼後的變量
        bo = (val==var)
        #命名,並將True轉為1,False轉為0
        dummy[var.name+"_"+str(val)] = bo.astype(int)
    return dummy

將啞變量進一步轉化為虛擬變量合併至數據集中,代碼如下:
#每個特徵刪去一個類別,得到虛擬變量
dummy_df1 = dummy_df.drop(['land_condition_S','foundation_type_O','roof_type_H','ground_floor_type_T'],axis = 1)
#刪去原特徵,合併虛擬變量
data1 = data1.drop(['land_condition','foundation_type','roof_type','ground_floor_type'],axis = 1)
data1 = pd.concat([data1,dummy_df1],axis = 1)

可能很多夥伴不太了解為什麼虛擬變量可以這樣轉換,虛擬變量與啞變量相比,減少了特徵的維度,本質是類似的,以"roof_type"這一特徵舉例,經過啞變量轉換形成三個新特徵:["roof_type_H","roof_type_L","roof_type_R"],如果在"roof_type"為"R"的樣本,在啞變量的表達方式應該是[0,0,1],但是如果從啞變量中刪去"roof_type_R"這一特徵,表達方式就可以變成[0,0],通過唯一性就可以利用前兩個特徵推出第三個特徵的值,所以減少了不必要的特徵以實現降維。當然這裡還可以做一下方差過濾、相關性分析等操作進一步實現特徵降維,各位在實操的時候可以自己試一下。建模工作前面說過了這個是一個多元分類項目,所以在建模的時候可以有兩種選擇,一是利用多元分類器,比如隨機森林、樸素貝葉斯,二就是利用二元分類器實現多元分類任務,比如邏輯回歸、SVM。後面文章會寫一篇關於二元分類器實現多元分類的文章,本文就集中於多元分類器的實現,主要用到的兩個分類器是隨機森林和LGBM。一般建模的流程大致是在訓練集上切分訓練集和測試集,有的數據需要標準化處理,然後訓練模型,利用測試集進行預測,獲取模型的準確率或其他衡量模型好壞的指標,下面以隨機森林分類器模擬一下該流程。首先進行數據切分,可以選擇控制訓練集和測試集的比例:
from sklearn.model_selection import train_test_split
features = data2.iloc[:,0:-1].values
label = data2.iloc[:,-1].values
X_train,X_test,y_train,y_test = train_test_split(features,label,test_size = 0.3)

這裡介紹一下可以減少代碼量的管道流,如果正常來說,我們可能要分別實例化標準化和PCA的API,然後再傳入訓練集和測試集,這些操作可以利用管道流封裝到一起,讓代碼看起來更加簡潔。
from sklearn.ensemble import RandomForestClassifier
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline,Pipeline
#管道流簡化工作流
pipe_rf = make_pipeline(StandardScaler(),
                        PCA(n_components=10),
                        RandomForestClassifier())
pipe_rf.fit(X_train,y_train)
#得到每個類別的概率
pred_y_rf = pipe_rf.predict_prob(X_test)

利用predict_prob計算出標籤變量得到每個類別的概率,然後利用索引排序可以得到概率最大的兩個類別:
pred_df = pd.DataFrame(data=pred_y_rf.argsort()[:, -2:][:, ::-1], columns=['y1', 'y2'])
pred_df.to_csv("eq_submission.csv",index=False)

由於數據量比較大,調參比較費時,在沒有調參的情況下,隨機森林模型的概率大致為68%,LGBM模型的準確率大致為70%,準確率並不是太好,除準確率外還可以通過查全率、查準率、F1-score衡量一下模型的好壞,上文大體上提供了一個建模前及建模的思路而已,夥伴們可以利用自己的思路,再加上調參應該會得到一個不錯的模型。這幅圖是關於特徵重要度的餅圖,可以根據餅圖再調節特徵,其中area佔比是比最大的,然後"distict_id"佔比也是不小的,但是上文關係矩陣中與標籤變量的相關性又很小,所以分析要相互結合、更加全面一些才好。
說在最後上面的一系列操作都是為了最後的模型,但如果作為一個競賽,你需要提交一份文件,而這份文件從何來?競賽會給出一個不含標籤變量的測試集!注意與測試集中分割出的測試集不同。我們同樣需要對測試集做一些數據處理,操作和訓練集類似,然後將訓練出的模型應用在測試集上,會得出最後的結果保存成一個新的csv文件,這就是你最後需要提交的文件啦。

20行Python代碼實現一款永久免費PDF編輯工具

微軟太良心,這麼強大的軟體竟然完全免費!

這個只有1.5M的軟體,能讓你的網速快3倍

為了回饋廣大讀者朋友,我特地免費送給大家三份大禮

1. Pandas 官方教程中文版。 

2. 300G 硬核 Python 視頻,涵蓋你所有想看。  

3. 一個月精通 Python 的秘籍。

下面是部分視頻的截圖

資料獲取方法

長按掃描下方二維碼關注

在後臺回復關鍵詞:資料


掃描關注,回復"資料"免費領取

相關焦點

  • 機器學習筆記——機器學習實戰之準備(一)
    機器學習的主要任務就分類。機器學習關鍵術語:分類;訓練集;樣本集;訓練樣本;目標樣本;知識表示訓練集是用於機器學習算法的數據樣本集合1.3 機器學習的主要任務機器學習的主要如何解決分類問題,主要任務是將實例數據劃分到合適的分類中。機器學習的另一項任務就是回歸。
  • 《DEEP LEARNING》《機器學習-周志華》《統計學習方法-李航》《機器學習實戰》《利用Python進行數據分析》
    《深度學習》AI聖經!深度學習領域奠基性的經典暢銷書!        這是深度學習的權威教科書,由該領域的主要貢獻者撰寫。此書內容非常清晰、全面並且權wei。閱讀這本書,你可以知道深度學習的由來、它的好處以及它的未來。
  • 圖像分類:一個更魯棒的場景分類模型
    ,解決圖片的角度、尺度、和光照的多樣性問題。如何根據圖像的視覺內容為圖像賦予一個語義類別(例如,教室、街道等)是圖像場景分類的目標,也是圖像檢索、圖像內容分析和目標識別等問題的基礎。但由於圖片的尺度、角度、光照等因素的多樣性以及場景定義的複雜性,場景分類一直是計算機視覺中的一個挑戰性問題。本次任務從400萬張網際網路圖片中精選出8萬張圖片,分屬於80個日常場景類別,例如航站樓、足球場等。每個場景類別包含600-1100張圖片。
  • 如何利用深度學習模型實現多任務學習?這裡有三點經驗
    參與:Tianci LIU、路Taboola 算法開發者 Zohar Komarovsky 介紹了他們在利用深度學習模型實現多任務學習(MTL)時遇到的幾個典型問題及解決方案。我們運用多任務學習(Multi-Task Learning,MTL),在相同的輸入特徵集上預測多個關鍵性能指標(Key Performance Indicator,KPI),然後使用 TensorFlow 實現深度學習模型。回想最初的時候,我們感覺(上手)MTL 比現在要困難很多,所以我希望在這裡分享一些經驗總結。現在已經有很多關於利用深度學習模型實現 MTL 的文章。
  • 二分類、多分類、回歸任務,一個項目get競賽必備模型
    機器之心報導機器之心編輯部數據挖掘類比賽必備模型,四種實現方法,你值得擁有。數據科學競賽是學習各類算法、深入理解數據科學、提升和挑戰自己的絕佳機會,而這些競賽中有一些常用的模型。近日,有開發者在 GitHub 上開源了一個包含數據挖掘類比賽常用模型的項目,主要涵蓋二分類、多分類以及回歸任務。項目代碼全部使用 Python 實現。
  • 超級乾貨 :一個框架解決機器學習大部分問題
    一個叫 Abhishek Thakur 的數據科學家,在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem,介紹他建立的一個自動的機器學習框架,幾乎可以解決任何機器學習問題,項目很快也會發布出來。這篇文章迅速火遍 Kaggle,當然也是受到爭議,很多人覺得並不全面。
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    機器之心整理參與:機器之心編輯部機器學習日益廣為人知,越來越多的計算機科學家和工程師投身其中。不幸的是,理論、算法、應用、論文、書籍、視頻等信息如此之多,很容易讓初學者迷失其中,不清楚如何才能提升技能。本文作者依據自身經驗給出了一套快速上手的可行方法及學習資源的分類匯總,機器之心在其基礎上做了增益,希望對讀者有所幫助。
  • 人工智慧之機器學習ML 學習筆記乾貨
    與傳統的為解決特定任務、硬編碼的軟體程序不同,機器學習是用大量的數據來「訓練」,通過各種算法從數據中學習如何完成任務。機器學習則是機器通過大數據的輸入,從中主動尋求規律,驗證規律,最後得出結論,機器據此結論來自主解決問題,如果出現了偏差,會自主糾錯。什麼是機器學習呢?
  • XGBoost實戰(二):解決二分類和多分類問題
    回歸樹產生的是連續的回歸值,如何用它解決二分類問題呢?通過前面的學習知道,邏輯回歸是在線性回歸的基礎上通過sigmoid函數將預測值映射到0~1的區間來代表二分類結果的概率。和邏輯回歸一樣,XGBoost也是採用sigmoid函數來解決二分類問題,即先通過回歸樹對樣本進行預測,得到每棵樹的預測結果,然後將其進行累加求和,最後通過sigmoid函數將其映射到0~1的區間代表二分類結果的概率。
  • 8個頂級機器學習解決方案
    在當今雲計算超高速發展的時代,機器學習解決方案在改進系統方面取得了指數級的進步。機器學習利用大數據分析和識別模式的能力為當今的企業提供了關鍵的競爭優勢。   機器學習通常與人工智慧和深度學習結合使用,使用複雜的統計建模。
  • 【CTR】MMoE-PosBias:Youtube 多任務學習框架
    推薦系統中會出現很多挑戰,比如多目標問題、選擇偏差問題問題等,為了解決這樣的挑戰,作者提出了 MMoE-PosBias 架構,利用 MMoE 框架解決多目標問題,並利用 Wide&Deep 框架來緩解選擇偏差的問題。
  • 百度官方:《深度學習中文教程實戰版》免費開發!
    今天誠心給大家推薦一個由多位百度大佬共同開發的免費訓練營——《深度學習7日打卡營_極速入門特輯》,神器高層API會貫穿全程,分分鐘讓你技術提高好幾個level~在7天中,你將直接跳過冗長的理論、懵bi~的調試,讓你掌握深度學習任務的通用套路,能夠
  • 基於TensorFlow的深度學習實戰
    圖像、視頻、文本、音頻等領域的問題,都可以通過深度學習解決。TensorFlow可以用於實現前述所有應用。TensorFlow很快成為GitHub上用戶最多的深度學習框架。這個庫之所以如此流行,是因為開發人員可以輕鬆的用其來搭建、測試和部署機器學習應用。上面是一個TensorFlow的示意圖。
  • R做機器學習簡易教程
    本文介紹如何利用R語言做一個完整的機器學習項目。一個小項目,端到端,遵循機器學習的實施的工作流,系統地完成項目。
  • 【玩轉數據系列十】利用阿里雲機器學習在深度學習框架下實現智能圖片分類
    首先,解決非結構化數據常常要使用深度學習算法,上手門檻高。其次,對於這部分數據的處理,往往需要依賴GPU計算引擎,計算資源代價大。本文將介紹一種利用深度學習實現的圖片識別案例,這種功能可以服用到圖片的檢黃、人臉識別、物體檢測等各個領域。
  • 如何解決機器學習中數據不平衡問題
    如何解決機器學習中數據不平衡問題來源:36大數據
  • 基於Text-CNN模型的中文文本分類實戰
    本文介紹NLP中文本分類任務中核心流程進行了系統的介紹,文末給出一個基於Text-CNN模型在搜狗新聞數據集上二分類的Demo。文本分類是自然語言處理領域最活躍的研究方向之一,從樣本數據的分類標籤是否互斥上來說,可以分為文本多分類與文本多標籤分類。
  • 深度 | 當前最好的詞句嵌入技術概覽:從無監督學習轉向監督、多任務學習
    「Quick-thoughts」分類任務示意圖。與之前詳細討論的無監督學習不同,監督學習需要一個帶標籤的數據集,為一些像自然語言推理(例如:有蘊含關係的句子對)或者機器翻譯(例如:翻譯前後的句子對)這樣的任務進行標註。監督學習提出了以下兩個問題:(1)如何選擇特定任務?(2)若要獲得高質量的嵌入,所需的數據集大小應該如何確定?在本文的下一節和最後一節,作者將會對多任務學習進行進一步的討論。
  • 多任務深度強化學習綜述
    通過組合所有單智能體的學習參數,全局網絡會導出一組新參數並將其與所有智能體共享,主要目標是通過在相同環境中運行的多個相關任務之間遷移學習(共享知識)來增強RL智能體的整體性能。多任務學習的關鍵之一是RL智能體應開發一個常識庫並學習可以在各種相關任務間共享和使用的一般技能。另外,多任務間的競爭應該保持平衡。
  • 就在剛剛,百度重磅發布《深度學習中文教程實戰版》,對外免費開發!
    今天誠心給大家推薦一個由多位百度大佬共同開發的免費訓練營——《深度學習7日打卡營_極速入門特輯》,神器高層API會貫穿全程,分分鐘讓你技術提高好幾個level~在7天中,你將直接跳過冗長的理論、懵bi~的調試,讓你掌握深度學習任務的通用套路,能夠