🍎 連享會主頁:lianxh.cn
New! lianxh 命令發布了: GIF 動圖介紹 隨時搜索 Stata 推文、教程、手冊、論壇,安裝命令如下: . ssc install lianxh
連享會 · 最受歡迎的課 🍓 2021 Stata 寒假班 ⌚ 2021 年 1.25-2.4
🌲 主講:連玉君 (中山大學);江艇 (中國人民大學)
👉 課程主頁 :https://gitee.com/arlionn/PX
作者: 樊嘉誠 (中山大學)
E-Mail: fanjch676@163.com
目錄
1. 引言
2. 理論介紹
3. 命令介紹和安裝
3.1 基本介紹
3.2 安裝方法
3.3 語法及選項
3.4 注意事項
4. Stata 實操
4.1 數據結構描述
4.2 模型訓練和結果
4.3 結果匯總
5. 總結
6. 參考資料
溫馨提示: 文中連結在微信中無法生效。請點擊底部「閱讀原文」。
1. 引言
「如何根據西瓜的色澤、根蒂、敲聲等特徵分辨出好瓜和壞瓜」,這是我們日常生活中經常面臨的分類問題 (classification problem) 。而在學術研究中,諸多研究都離不開分類 的影子:識別經濟周期,判斷未來經濟形勢;研究上市公司財務信息,對其財務困境或危機進行預警……此外,計算機視覺、垃圾郵件分類、醫學診斷等也與分類問題密切相關。
回想經典的計量模型 Logit 回歸 ,為解決離散選擇問題提供思路,本質上也可視作一種分類算法。隨著大數據時代的到來,許多分類任務面臨著數據維度過高 、數據質量較低 、樣本不平衡 等諸多問題。機器學習 (Machine Learning, ML) 算法作為近年來炙手可熱的方法,為解決這些問題開闢了新的思路與途徑。
本推文將要介紹的命令 c_ml_stata 利用 Python 語言在 Stata 中實現了機學習分類算法,不僅囊括了眾多分類算法,如支持向量機 、決策樹 、神經網絡 等;也支持交叉驗證 (Cross Validation, CV) ,是利用 Stata 處理分類問題有力工具。本推文的餘下部分安排如下:在第二部分,對該命令的部分機器學習分類算法進行簡單的理論介紹;在第三部分,對該命令的簡要介紹和安裝方法進行說明;在第四部分,利用該命令及其提供的數據集使用 Stata 進行分類問題的處理;在第五部分,對本推文主要內容進行總結。
2. 理論介紹
機器學習分類算法眾多,由於篇幅有限,現結合 c_ml_stata 命令中提供的部分分類算法進行簡要的理論介紹,以便對機器學習分類問題、算法及後續命令使用有更清楚的認識。熟悉這些算法的讀者可以快速跳過 。該部分主要介紹的機器學習算法包括:支持向量機 (Support Vector Machine, SVM) 、決策樹 (Decesion Tree) 和神經網絡 (Neural Network, NN) 。
2.1 支持向量機2.1.1 支持向量與間隔
支持向量機是一種二分類器 ,它的基本思想是基於訓練集 在樣本空間中尋找一個劃分超平面 ,將不同類別的樣本劃分開。
支持向量機學習方法包括由簡至繁的一系列模型:當訓練數據線性可分時,通過硬間隔最大化 (hard margin maximization) ,學習一個線性分類器,即線性可分支持向量機 ;當訓練數據近似線性可分時,通過軟間隔最大化 (soft margin maximization) ,也學習一個線性分類器,即線性支持向量機 ;當訓練數據線性不可分時,通過使用核方法 (kernel method) 及軟間隔最大化,學習 非線性支持向量機 。
我們從最簡單的線性可分支持向量機作為引入,假定給定一個特徵空間訓練數據集 ,其中, 表示具有 個特徵的特徵向量 (feature vector) , 表示因變量的兩個不同的分類標籤 (class label) 。並且假定訓練數據集是線性可分的 。我們的目的是找到一個劃分超平面 將實例劃分到不同的類,其中, 為法向量, 為截距。故可定義相應的分類函數為
特別地,若 表示樣本點位於劃分超平面上,被稱之為「支持向量 」 (support vector) 。
一般地,對於線性可分的數據,存在無窮多個劃分超平面可以將兩類數據正確地分開,那麼如何獲得一個唯一的最優劃分超平面呢?在下圖中,有 三個點,表示 個實例,且預測分類時均在劃分超平面的一側。因為 點距分類超平面較遠,就比較確信 點被正確分類的可信度較高; 點離劃分超平面較近,因此可能懷疑劃分是否準確 (可信度較低) ;而 點介於點 和 之間,預測其分類結果的可信度介於 與 之間。上述直覺引導我們如何確定最優的劃分超平面——一般來說,一個點離劃分超平面的遠近可以表示分類結果的可信度,而最優的劃分超平面應使得所有點的分類結果可信度儘可能的高 。由基本的空間幾何知識可以知道, 恰好可以相對地表示第 個實例到劃分超平面的距離。此外,若 則表示分類正確。在此,引入一個非常關鍵的概念—— 間隔 (margin) ,定義為
基於最初的直覺,我們的目標自然是希望即使是離劃分超平面最近的點,其劃分結果的可信度也較高。因此,最大化間隔 是一個不錯的想法。然而,注意到如果我們成比例地改變 和 ,雖然我們的間隔變化了,但是超平面本身並未改變。因此,為求得唯一解,對法向量施加某種約束是必要的 (如規範化,約束 ) 。最終,我們可以寫出如下最優化問題
略微遺憾的是,以上最優化問題是「非凸」 (Non-convex) 的,求解過程較為複雜。幸運的是,上述最優化問題可以通過等價變換,轉換為以下凸 (Convex) 問題:
求得最優解 即可得到最優劃分超平面。可以證明,該最優劃分超平面是存在且唯一的。
2.1.2 軟間隔
以上的討論中,我們假定了訓練數據集可以被劃分超平面準確、完全地分開。然而,在實際問題中,我們往往難以確定數據是否線性可分;或者,即使數據線性可分,也很難斷定這個貌似線性可分的結果不是由於過擬合 導致的。因此,為了減少數據中」噪聲「的幹擾,我們允許支持向量機在一些樣本上的分類結果出錯。為此,我們需要引入軟間隔 (soft margin) 的概念。之前的約束要求所有樣本均劃分正確,即滿足 ,這可以理解為「硬間隔」。而軟間隔則允許某些樣本不滿足該約束,當然這些不滿足樣本的約束應該儘可能的少,因此優化目標可以寫為
其中, 是正則化係數, 越大,表示我們對錯誤分類的容忍程度越低,間隔越小;反之, 越小,表示我們對錯誤分類的容忍程度越大,間隔越大。 為示性函數 ,即
引入鬆弛變量 (slack variables) ,可以將上式重寫為
2.1.3 核方法
由於現實中的許多問題並非是線性可分的,對於非線性可分的數據,常採用核方法 將樣本從原始空間映射 到更高維的特徵空間 (如下圖所示) ,使得樣本在這個特徵空間內線性可分。
令 表示 映射後的特徵向量,於是,在特徵空間中劃分超平面所對應的模型可以表示為
因此,最優化問題可以寫為
在求解過程中,由於需要計算樣本 與 映射到特徵空間之間的內積 。因為特徵空間的維度可能很高,直接計算內積通常十分困難,因而設想如下函數
可以大大簡化運算過程。而函數 稱為核函數 (kernel function) 。核函數的選取並非是任意的,需要滿足一些條件,受限於篇幅我們不作詳細討論。以下列出一些常用的核函數:
2.1.4 補充
支持向量機可以構造對偶問題 ,利用拉格朗日乘子法求解。支持向量機最終可轉化為一個二次規劃 問題,使用諸如 SMO ( Sequential Minimal Optimization ) 等高效算法求解 (由於我們本著淺顯地了解支持向量機的基本理論,便不詳細介紹其求解優化過程)。
此外,支持向量機有以下優劣勢,我們在使用該分類方法時需額外注意:
支持向量機的最優化函數僅由少數的支持向量確定,計算的複雜性取決於支持向量的個數,而非樣本空間的維數,因此在某種程度上可以避免「維數災難」。支持向量機擁相對於其他
黑箱 (Black box) 的機器學習方法有更多的更有理論,並且其結果具有較好的
穩健性 (Robust) 。支持向量機算法難以用於大規模的訓練樣本的計算,對缺失數據和核函的選取較為敏感。傳統的支持向量機算法僅適用於二分類問題,而實際應用中常常面臨多分類任務。2.2 決策樹2.2.1 基本模型
決策樹是一種基於的分類和回歸方法,顧名思義,決策樹呈現樹形結構 (見下圖) 。一顆決策樹由結點 (node) 和有向邊 (directed edge) 或分枝組成,結點一般包括根結點、內部結點和葉結點,可以形象類比為「樹根」和「樹葉」,有向邊可以理解為「樹枝」。用決策樹分類的基本思想是,從根結點開始,對樣本的某一特徵 (劃分依據) 進行測試,根據測試結果將樣本分配到子結點;如此遞歸地對樣本進行測試並分配,直至到達葉結點。
2.2.2 特徵選擇
決策樹學習的關鍵問題之一是特徵選擇 ,即在每次分類時選擇什麼特徵進行測試和劃分。因此,我們需要確定選擇特徵的準則。直觀上,如果某一個特徵具有更好的分類能力,那麼決策樹按這一特徵分類後的各個子類應儘可能地屬於同一類別,結點的「純度」越高。接下來,我們會依次引入一些概念:信息熵、條件熵、信息增益以及信息增益比,來理解如何進行特徵選擇。
信息熵 (information entropy) 是度量樣本集合純度的一種指標,對於一個有 個離散取值的隨機變量 ,其概率分布為
其信息熵定義為
特別地,若 ,定義 ;上式的對數常以以 為底或者以 為底。熵越大,隨機變量的不確定性越大。可以證明 。
對於隨機變量 ,其聯合概率分布為
條件熵 (conditional entropy) 表示在已知隨機變量 的條件下隨機變量 的不確定性,定義為 給定條件下 的條件概率分布的熵對 的數學期望
這裡, 。當熵和條件熵中的概率由數據估計獲得時,所對應的熵和條件熵分別成為經驗熵 和經驗條件熵 。
信息增益 (information gain) 表示得知特徵 的信息而使得類 的信息不確定性減少的程度,因此我們定義特徵 對訓練數據集 的信息增益 為數據集 的經驗熵 與特徵 給定下其條件熵 的差,即
顯然,對於具有較強分類能力的特徵,其信息增益更高。因此,我們利用信息增益選擇特徵的方法是,對於訓練數據集 ,計算其每個特徵的信息增益,選擇信息增益最大的特徵。
但是,使用信息增益作為劃分標準存在偏向於選擇特徵取值較多的特徵的問題,這樣是不公平的。因此,引入了信息增益比 (information gain ratio) 的概念。定義特徵 對訓練數據集 的信息增益比 為其信息增益 與訓練數據集 關於特徵 的值的熵 之比,即
2.2.3 樹的生成
決策樹的生成有多種算法,如 ID3 、C4.5 等經典的生成算法。為了理解決策樹的生成過程,我們還是選擇介紹其中的一種生成算法:ID3 ,其核心思想是在樹的各個結點用信息增益作為特徵選擇準則,遞歸地構建決策樹。具體方法是:
從根結點開始,對結點計算所有可能特徵的信息增益,選擇信息增益最大的特徵作為結點的特徵,並由該特徵的不同取值建立不同的子結點;直到所有特徵的信息增益很小或者所有特徵均選擇完畢為止。
C4.5 算法與 ID3 算法相似,不同之處在於, C4.5 使用信息增益比作為特徵選擇的依據。此外還有諸如 CART 算法等等多種多樣的生成樹的方法。
2.2.4 補充
生成決策樹後,往往還需要對其進行剪枝 (pruning) ,顧名思義,就是從已生成的樹上裁剪一些子樹或者葉結點,對樹的結構進行簡化以防止其過擬合。總結一下決策樹的優缺點:
易於理解和實現,並且能夠理解決策樹所表達特徵的含義;
因此,在其基礎上也有諸多拓展模型:與袋裝法 (Bagging) 思想結合的隨機森林 (Random Forest) ,與提升法 (Boosting) 結合的梯度提升樹 (Gradient Boosting Decesion Tree) 、極端梯度提升樹 (Extreme Gradient Boosting Decesion Tree) 等等。
2.3 神經網絡2.3.1 神經元
神經網絡是現在比較流行的機器學習算法,可以處理回歸、分類等多種問題。神經網絡中最基本的結構是神經元 (neuron) ,其結構見下圖。
一個最基本的神經元由輸入 (input) 、權重 (weight) 、偏置 (bias) 或閾值 (threshold) 、激活函數 (active function) 和輸出 (output) 組成。以一個有多個輸入只有一個輸出的神經元為例,其接受了 個輸入信號 ,即 ,這些輸入信號通過帶權重的連接進行傳遞,其加權後的總輸入與神經元的閾值比較,通過激活函數處理產生輸出。若將第 個輸入信號的權重寫為 ,則加權總輸入為 。設閾值為 ,權重函數為 ,則神經元產生的輸出為
激活函數 往往是非線性的,有以下常用多種激活函數可以使用:
一般而言,常常選取 ReLu 激活函數,原因是該函數形式較為簡單,計算快、收斂快且可以避免諸如梯度消失等問題。
2.3.2 前饋神經網絡
神經網絡結構一般由**輸入層 (input layer) ** 、**隱層 (hidden layer) ** 和 輸出層 (output layer) 組成。
隱層和輸出層:由多個有激活函數結構的神經元組成,且同層間神經元的激活函數往往相同。
最經典也是最常見的前饋神經網絡 正是由輸入層、隱層和輸出層構成,其特點是含有多個隱層,每層神經元與下一層神經元全互連,神經元之間不存在同層連接,也不存在跨層連接 。如下圖所示。
2.3.3 神經網絡分類算法
一般地,對於一個多分類問題,我們可以定義神經網絡的輸出 維列向量 ,其中 既可以是連續取值,也可以是離散取值如 。該網絡共有 個隱層,簡單起見我們各個隱層及輸出層神經元的激活函數均為 ,輸入層接受的輸入即分類的特徵 維列向量 。該前饋神經網絡可以寫為如下遞歸形式:
其中, 和 分別為各個隱層神經元權重與偏置組成的矩陣或向量, 即為神經網絡的輸出。特別地,若輸出 中 為連續取值,想要得到分類結果或離散的取值,我們可以使用 softmax 方法計算其「概率」,即
設定某一閾值,或將其最大的 對應為 ,其餘為 ,即可得到分類結果。
2.3.4 補充
前饋神經網絡中的權重 和偏置 均是未知參數,常用誤差逆傳播算法 (Error BackPropagation, BP) 進行確定。神經網絡算法有以下需要注意的地方:
神經網絡的結構 (即設定多少個隱層、包含多少個神經元) 需要事先設定,其結構與算法的收斂性、是否過擬合 (over fitting) 等問題密切相關;為了便於計算、消除量綱的影響,一般對輸入數據進行
標準化 (normalization) 處理。由於神經網絡具有強大的表示能力,經常需使用一些策略避免過擬合,如早停 (early stop) 、正則化 (regularization) 、丟包法 (dropout) 等。
3. 命令介紹和安裝
熬過以上略微繁瑣的算法理論介紹,正是來到本次推文的主角命令——c_ml_stata 。雖然機器學習算法十分複雜 (遠比以上的理論介紹要複雜許多) , 但是該命令較為簡潔而直接地集成了多種算法,同時十分容易調用。該部分主要對命令進行基本介紹,說明其安裝方法以及語法選項的使用及一些注意事項。
3.1 基本介紹
c_ml_stata 由 Giovanni Cerulli 編寫,是在 Stata 16 中實現機器學習分類算法的命令,該命令使用 Python 中的 Scikit-learn 接口實現模型訓練、預測等功能,主要有以下特點:
支持多種分類算法: 該命令提供了分類樹 (Classification tree) 、袋裝樹和隨機森林 (Bagging and random forests) 、提升算法 (Boosting) 、正則化多項式 (Regularized multiomial) 、K 近鄰算法 (K-Neareast Neighbor) 、神經網絡 (Neural network) 、樸素貝葉斯 (Naive Bayes) 和支持向量機 (Support vector machine) 多種分類算法,便於模型的嘗試和比較。
支持交叉驗證: 該命令提供了 cross_validation 選項,利用「貪婪搜索」 (greed search) 實現
K 折交叉驗證 (K-fold cross validation) 選擇最優超參數 (hyper parameters) ,調優分類模型。3.2 安裝方法
c_ml_stata 需要在 Stata 16.0 及以上版本使用。在 Stata 的命令行中輸入 ssc install c_ml_stata 即可下載,或者使用如下命令打開下載頁面:
. veiw net describe c_ml_stata // 命令包簡介查看與之相關的完整程序文件和相關附件,主要包括以下文件:
example_c_ml_stata.do :作者提供示例的 do 文件。c_ml_stata_data_example.dta :作者提供示例的樣本內訓練數據。c_ml_stata_data_new_example.dta :作者提供示例的樣本外預測數據。如果想完全使用命令來安裝,可以執行如下兩條命令:
· net install c_ml_stata // 安裝命令包 . net get c_ml_stata // 下載附件:dofile, .dta 等 // 存儲在當前工作路徑下 3.3 語法及選項c_ml_stata 主要命令的語法格式為:
c_ml_stata outcome [varlist], mlmodel(modeltype) out_sample(filename) in_prediction(name) out_prediction(name) cross_validation(name) seed(integer) [save_graph_cv(name)]輸入變量的含義如下:
outcome:是一個數值型、離散的因變量 (或標籤) ,表示不同的類別。若因變量有 種類別,建議對其類別進行編碼 (recode) ,取值範圍為 。例如,對於一個二元變量 (取值為 或 ) ,則應編碼成 。注意: outcome 不接受缺失值 。varlist:是代表自變量 (或特徵) 的數值型變量列表,屬於可選項。若某一特徵也是類別變量,則需先生成相應的數值型、離散的虛擬變量。注意: varlist 不接受缺失值 。各個選項的含義如下:
mlmodel(modeltype):指定使用的機器學習分類算法 (模型) ,有以下幾種選擇:
tree : Classification tree (分類樹)randomforest : Bagging and random forests (袋裝樹和隨機森林)boost : Boosting (提升算法,提升樹)regularizedmultionmial : Regularized multinomial (正則化多項式)nearestneighbor : Nearest Neighbor (K 近鄰算法)neuralnet : Neural network (神經網絡)naivebayes : Naive Bayes (樸素貝葉斯)svm : Support vector machine (支持向量機)out_sample(filename):要求指定一個樣本外的新數據集 (測試集) ,該數據集僅包含各個特徵 (無因變量) ,用於樣本外測試。filename 表示存放該數據集的文件名。
in_prediction(name):保存樣本內訓練數據 (訓練集和驗證集) 的擬合結果,name 為文件名。
out_prediction(name):保存樣本外數據 (測試集) 的預測結果 ,name 為文件名。樣本外數據從 out_sample 中獲得。
cross_validation(name):將 name 設定為 "CV" 可以執行交叉驗證,默認為 10 折交叉驗證。
seed(integer):隨機種子 (整數) 。
[save_graph_cv(name)]:可選項,保存交叉驗證中模型在訓練集和驗證集上分類結果的準確性 ( Accuracy ) ,用於確定最優的超參數和模型。
c_ml_stata 的返回值:
儲存通過交叉驗證確定的最優超參數 (不同模型儲存的超參數不同) 、最優訓練集準確率、最優驗證集準確率,可以通過 ereturn list 命令查看 (數值型返回值儲存在 scalars 中,字符型結果儲存在 macros 中) 。3.4 注意事項運行 c_ml_stata 程序需要擁有 Stata 16 及 Python (2.7 及以上版本) ,同時需安裝 Python 的 Scikit-learn 和 Stata Function Interface (SFI) 兩個依賴庫。outcome 和 varlist 均不允許出現缺失值,因此在使用該命令前需檢查數據集是否出現缺失值 (並刪除缺失值)。建議安裝該命令的最新版本並及時更新,命令為:ssc install c_ml_stata, replace。更多詳細介紹可使用 help c_ml_stata 命令獲取。
4. Stata 實操我們使用 c_ml_stata 提供的數據集 (儲存在 c_ml_stata_data_example.dta 文件中) 進行實操。由於作者並未提供過多有關該數據集的其他解釋信息,所以該例子僅作為操作和演示提供,實際意義不大。
4.1 數據結構描述該數據集共有 74 個樣本,包含 4 個解釋變量 (分別命名為 x1, x2, x3, x4 ) 和 1 個因變量 (命名為 y ) 。其中,4 個解釋變量均為連續變量,而因變量為分類變量 (離散取值) ,因此我們分別使用 summary 和 tab 命令對變量進行描述性統計。可以看出,根據 c_ml_stata 命令的要求,輸入數據集並無缺失值。待分類變量 (作為 outcome 的輸入) y 進行數值化編碼, 分別代表三種類別。
. use "c_ml_stata_data_example.dta", clear . tab y y | Freq. Percent Cum. --+ 1 | 42 56.76 56.76 2 | 22 29.73 86.49 3 | 10 13.51 100.00 --+ Total | 74 100.00 . sum x1-x4 Variable | Obs Mean Std. Dev. Min Max +---- x1 | 74 6165.257 2949.496 3291 15906 x2 | 74 21.2973 5.785503 12 41 x3 | 74 3019.459 777.1936 1760 4840 x4 | 74 187.9324 22.26634 142 233 4.2 模型訓練和結果由於 c_ml_stata 提供了多種有監督學習分類算法,我們使用變量 x1, x2, x3, x4 作為解釋變量,y 作為標籤進行模型訓練。以下部分我們以支持向量機為例,詳細介紹該命令的調用方法和輸出結果。
4.2.1 支持向量機將選項 mlmodel 設定為 svm 即可使用支持向量機算法進行分類。樣本內預測結果保存在文件 in_pred_svm.dta 中,使用 c_ml_stata_data_new_example.dta 文件讀取樣本外數據 (僅包含特徵 x1, x2, x3, x4 ) ,樣本外預測結果保存在文件 out_pre_svm.dta 中。在 cross_validation 選項中使用 CV 即可進行交叉驗證,交叉驗證結果自動保存在 CV.dta 文件中;若有需要可使用 save_graph_cv 選項可視化交叉驗證結果並保存。具體代碼及部分輸出結果如下:
. c_ml_stata y x1-x4, mlmodel(svm) /// out_sample("c_ml_stata_data_new_example") /// in_prediction("in_pred_svm") /// out_prediction("out_pred_svm") /// cross_validation("CV") /// seed(10) save_graph_cv("graph_cv_svm") --- CROSS-VALIDATION RESULTS TABLE --- The best score is: 0.5678571428571428 --- The best parameters are: {'C': 1, 'gamma': 0.1} 1 0.1 --- The best estimator is: SVC(C=1, break_ties=False, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma=0.1, kernel='rbf', max_iter=-1, probability=True, random_state=None, shrinking=True, tol=0.001, verbose=False) --- The best index is: 0 ---in_pred_svm.dta 部分數據如下圖所示,其中 index 表示觀測值樣本標號,與原數據樣本標號相對應;label_in_pred 表示樣本內標籤的預測結果;Prob_1, Prob_2, Prob_3 可能表示預測結果不是第 類的概率。
out_pred_svm.dta 數據結果與 in_pred_svm.dta 類似。其中,label_out_pre 表示樣本外標籤的預測結果,可以看出 SVM 將樣本外結果分類為第 類。
對於支持向量機算法,根據第二部分理論部分的介紹,我們的主要超參數為正則化係數 和核函數參數 (常記作 GAMMA ) 。使用 ereturn list 可返回最優的超參數選取結果,可以看出最優的正則化係數應設定為 ,和函數參數選取為 ;交叉驗證中訓練集的正確率為 ,測試集 (即驗證集) 正確率為 。
. ereturn list scalars: e(OPT_C) = 1 e(OPT_GAMMA) = .1 e(TEST_ACCURACY) = .5678571428571428 e(TRAIN_ACCURACY) = 1 e(BEST_INDEX) = 94.5詳細的交叉驗證結果可在 CV.dta 中查看。此外,通過 save_graph_cv("graph_cv_svm") 可視化交叉驗證結果並保存為 graph_cv_svm.gph 文件,結果如下所示。可以發現,隨著 index 的改變 (不同超參數組合的設定) ,模型在訓練集、驗證集的表現均不改變。值得注意的是,這種情況在實際應用中極為少見。
4.2.2 決策樹將 mlmodel 選項設定為 tree 即可使用決策樹進行分類。決策樹的超參數主要為葉子節點個數 (leaves) ,通過交叉驗證的可視化結果可以發現,隨著 index 的增加 (葉子節點個數的增加) , 模型在訓練集的表現不斷提高,而在驗證集的表現先上升後呈下降趨勢 (出現過擬合問題) ,因此可以得到最優的葉子節點個數 (對應於驗證集最高的分類正確率) 。使用 ereturn list 查看最有超參數的選取結果。可以發現,最優的葉子節點個數為 3 ;交叉驗證中訓練集的正確率為 ,測試集 (即驗證集) 正確率為 。
. c_ml_stata y x1-x4, mlmodel(tree) /// out_sample("c_ml_stata_data_new_example") /// in_prediction("in_pred_ctree") /// out_prediction("out_pred_ctree") /// cross_validation("CV") /// seed(10) save_graph_cv("graph_cv_ctree") . ereturn list scalars: e(OPT_LEAVES) = 3 e(TEST_ACCURACY) = .6375 e(TRAIN_ACCURACY) = .8108095884215288 e(BEST_INDEX) = 2 4.2.3 神經網絡將 mlmodel 選項設定為 neuralnet 即可使用神經網絡進行分類。神經網絡的主要超參數為神經網絡層數 (layers) 和神經元個數 (neurons) 。通過查看神經網絡在樣本內外的預測結果發現,該分類算法在該數據集上的表現較差,「暴力」地將所有標籤均分類為 ,分類正確率僅為 。通過交叉驗證可視乎結果也可以看出,該神經網絡模型對超參數選取較為敏感,而訓練集準確率均為 ,沒有任何改善。
4.3 結果匯總c_ml_stata 命令共提供了 8 種分類模型,逐一使用各模型對所提供的樣本內數據集進行訓練後,樣本內最優分類結果的準確率及驗證集集準確率如下所示:
模型最優訓練集 準確率最優驗證集 準確率決策樹 隨機森林 提升數 K 近鄰 神經網絡 樸素貝葉斯 支持向量機Note: 正則化多項式結果無法收斂,暫不參與比較。
5. 總結本推文的內容即將進入尾聲,簡要回顧我們上述的主要內容:我們簡單了解了什麼是分類問題以及機器學習 的分類算法,介紹了 c_ml_stata 這一 Python 和 Stata 結合的命令及其使用方法。我們可以看到隨著時代的發展,機器學習算法的多樣性以及其廣闊的應用範圍;但是,我們始終不能將方法做為最終的目的,其背後的經濟學含義依然值得我們思考。
6. 參考資料溫馨提示: 文中連結在微信中無法生效。請點擊底部「閱讀原文」。
連享會 · 最受歡迎的課 🍓 2021 Stata 寒假班 ⌚ 2021 年 1.25-2.4
🌲 主講:連玉君 (中山大學);江艇 (中國人民大學)
👉 課程主頁 :https://gitee.com/arlionn/PX
🍏 🍏 🍏 🍏 連享會主頁:🍎 www.lianxh.cn 直播視頻:lianxh.duanshu.com
免費公開課:
直擊面板數據模型:https://gitee.com/arlionn/PanelData - 連玉君,時長:1小時40分鐘Stata 33 講:https://gitee.com/arlionn/stata101 - 連玉君, 每講 15 分鐘.Stata 小白的取經之路:https://gitee.com/arlionn/StataBin - 龍志能, 2 小時部分直播課課程資料下載 👉 https://gitee.com/arlionn/Live (PPT,dofiles等)溫馨提示: 文中連結在微信中無法生效,請點擊底部「閱讀原文」。
關於我們🍎 連享會 ( 主頁:lianxh.cn ) 由中山大學連玉君老師團隊創辦,定期分享實證分析經驗。👉 直達連享會: 【百度一下: 連享會】即可直達連享會主頁。亦可進一步添加 主頁,知乎,面板數據,研究設計 等關鍵詞細化搜索。連享會主頁 lianxh.cnNew! lianxh 命令發布了: GIF 動圖介紹 隨時搜索連享會推文、Stata 資源,安裝命令如下: . ssc install lianxh 使用詳情參見幫助文件 (有驚喜): . help lianxh