在這篇文章中,我們要講到的是如何解決回歸問題,以及如何通過使用特征轉換、特征工程、聚類、提升算法等概念來提高機器學習模型的準确性。小白必入數據分析群,等你加入哦~
數據科學是一個叠代過程,隻有經過反複實驗,我們才能得到滿足我們需求的最佳模型/解決方案。
數據科學過程流 — 作者圖片
讓我們通過一個例子來關注上面的每個階段。我有一個健康保險數據集(CSV 文件),其中包含有關保險費用、年齡、性别、BMI 等的客戶信息。根據數據集中的這些參數來預測保險費用。這是一個回歸問題,我們的目标變量—費用/保險成本—是數字的。
讓我們從加載數據集并探索屬性開始(EDA — 探索性數據分析)
健康保險數據框
數據集有 1338 條記錄和 6 個特征。吸煙者、性别和地區是分類變量,而年齡、BMI 和兒童是數字變量。
處理空值/缺失值
讓我們檢查數據集中缺失值的比例:
年齡和 BMI 有一些少量空值。首先将處理這些缺失的數據,然後開始數據分析。Sklearn 的SimpleImputer允許您根據相應列中的均值/中值/最頻繁值替換缺失值。在這個例子中,我使用中值來填充空值。
現在我們的數據是幹淨的,我們将通過可視化和地圖來分析數據。一個簡單的seaborn pairplot可以給我們很多見解!
Seaborn Pairplot
看到了什麼..?
- 收費和兒童是傾斜的。
- 年齡與收費呈正相關。
- BMI 正态分布!
Seaborn 的箱線圖和計數圖可用于顯示分類變量對費用的影響。
分類變量的 seaborn 計數圖
基于上述圖的觀察結果:
- 男性和女性的人數幾乎相等,男性和女性的平均收費中位數也相同,但男性的收費範圍更大。
- 吸煙者的保險費用相對較高。
- 有2-3個孩子的人收費最高
- 客戶幾乎平均分布在 4 個地區,而且所有地區 的費用幾乎相同。
- 女性吸煙者的百分比低于男性吸煙者的百分比。
我們可以得出,“吸煙者”對保險費用的影響相當大,而性别的影響最小。
創建一個熱圖來了解費用和數字特征(年齡、BMI 和兒童)之間相關性的強度。
相關圖
我們看到年齡和 BMI 與費用具有平均 ve 相關性。
我們現在将一一介紹模型準備和模型開發的步驟。
- 功能編碼
在這一步中,我們将分類變量(吸煙者、性别和地區)轉換為數字格式(0、1、2、3 等),因為大多數算法無法處理非數字數據。這個過程稱為編碼,有很多方法可以做到這一點:
- LabelEncoding — 将分類值表示為數字(例如,具有值意大利、印度、美國、英國的區域等特征可以表示為 1、2、3、4)
- OrdinalEncoding — 用于将基于等級的分類數據值表示為數字。(例如将高、中、低分别表示為 1、2、3)
- One-hot Encoding — 将分類數據表示為二進制值 — 僅 0,1。如果分類特征中沒有很多唯一值,我更喜歡使用一次性編碼而不是标簽編碼。在這裡,我在 Region 上使用了 pandas 的一個熱編碼函數 ( get_dummies ) 并将其分成 4 别 — location_NE、location_SE、location_NW 和 location_SW。也可以對這一列使用标簽編碼,但是,一種熱門編碼給了我更好的結果。
2. 特征選擇和縮放
接下來,我們将選擇對“費用”影響最大的特征。我選擇了除性别之外的所有功能,因為它對費用的影響非常小(從上面的可視化圖表中得出結論)。這些特征将形成我們的“X”變量,而費用将成為我們的“y”變量。如果特征比較多,建議使用scikit-learn的SelectKBest進行特征選擇,得到top特征。
一旦我們選擇了特征,我們需要“标準化”數字——年齡、BMI、兒童。标準化過程将數據轉換為 0 到 1 範圍内的較小值,以便所有這些值都位于相同的範圍内,并且不會壓倒另一個。我在這裡使用了StandardScaler。
現在,我們都準備好創建第一個基本模型。我們将嘗試線性回歸和決策樹來預測保險費用
模型分數
平均絕對誤差 ( MAE ) 和均方根誤差 ( RMSE ) 是用于評估回歸模型的指标。我們的基線模型給出了超過 76% 的分數。在 兩種方法 之間,DecisionTrees 給出了更好的 MAE 為 2780。
讓我們看看如何讓我們的模型更好。
3A。特征工程
我們可以通過操縱數據集中的一些特征來提高我們的模型分數。經過幾次試驗,我發現以下項目可以提高準确性:
- 使用 KMeans 将類似客戶分組到集群中。
- 在區域列中将東北和西北地區劃分為“北部”,将東南和西南地區劃分為“南部”。
- 将 'children' 轉換為名為 'more_than_one_child' 的分類特征,如果孩子的數量 > 1 則為 'Yes'
所有功能
3B。特征變換
從我們的 EDA 中,我們知道Y的分布是高度偏斜的,因此我們将應用 scikit-learn 的目标轉換器——QuantileTransformer來規範化這種行為。
高達 84%……而 MAE 已減少到 2189!
4. Ensemble 和 Boosting 算法的使用
現在我們将在基于集成的 RandomForest、GradientBoosting、LightGBM 和 XGBoost 上使用這些功能。如果您是初學者并且不了解 boosting 和 bagging 方法。
我們的 RandomForest 模型确實表現良好 — MAE為 2078。現在,我們将嘗試使用一些增強算法,例如 Gradient Boosting、LightGBM 和 XGBoost。
模型得分
似乎都表現得很好.
5. 超參數調優
讓我們調整一些算法參數,例如樹深度、估計量、學習率等,并檢查模型的準确性。手動嘗試不同的參數值組合非常耗時。Scikit-learn 的GridSearchCV自動執行此過程并計算這些參數的優化值。我已經将 GridSearch 應用于上述 3 種算法。下面是 XGBoost 的一個:
GridSearchCV 中參數的最佳值
一旦我們獲得了參數的最佳值,我們将使用這些值再次運行所有 3 個模型。
模型得分
我們已經能夠提高我們的準确性——XGBoost 給出了 88.6% 的分數,錯誤相對較少.
1. 費用預測值與實際值的分布圖;2. 殘差圖 — 作者圖片
分布圖和殘差圖确認預測和實際存在良好的重疊。然而,有一些預測值遠遠超出了 x 軸,這使得我們的RMSE更高。這可以通過增加我們的數據點來減少,即收集更多數據。
我們現在準備将此模型部署到生産中并在未知數據上進行測試.
簡而言之,提高我的模型準确性的點。
☛創建簡單的新功能
☛轉換目标變量
☛聚類公共數據點
☛提升算法的使用
☛Hyperparameter調優
,