一、箱體何時出現問題
決策樹分箱是將連續變量分段,把連續值轉換為離散值。在大多數情況下,決策樹分箱是加快流程並提高模型性能的有效方式之一。但是,當箱體過少或過多時,會導致過擬合或欠擬合的問題。
為了避免此類問題,我們需要確定方便調整粒度的分箱方法。基於等頻分箱可實現更平滑的劃分,而根據等距分箱可以很好地處理強烈偏斜的變量。此外,基於最大信息係數(MIC)的方法也適用於強烈偏斜的變量,是包括度量關聯性和線性關係的一項有用技術。
下面是根據MIC技術分箱的代碼:
def MIC_breakpoints(x, y, n_breaks=10):
# Function that takes in a feature x and a target y and outputs breakpoints derived
# by the MIC method
from minepy import MINE
m = MINE()
m.compute_score(x, y)
breaks = [np.percentile(x,[i*100/n_breaks]) for i in range(1,n_breaks)]
return breaks
二、運用分箱提高模型性能
除了解決離群值或強烈偏斜變量的問題之外,決策樹分箱還可將指標空間減少為稍微少於最大類別的平方根。當具有多個變量的數據集變得更小時,能夠更容易地建立模型。
此外,通過降低過多過少的分箱的數量,可以減輕過擬合或欠擬合的情況,這也解釋了為什麼決策樹模型通常使用的是分箱後的分界點。
下面是在梯度增強樹(Gradient Boosted Trees)模型中運用分箱的示例:
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from pyspark.ml.feature import Bucketizer
# Creating instance of Bucketizer
bucketizer = Bucketizer(splits=[-float("inf"), 0, 10, 20, 30, float("inf")], inputCol="someContinuousFeature", outputCol="bucketizedFeature")
# Transforming the dataset using bucketizer instance
df_bucketized = bucketizer.transform(df)
# Dividing the data into train and validation sets
train, test = df_bucketized.randomSplit([0.8, 0.2], seed=11)
# Initializing GBT regressor model
gbt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=6, random_state=11)
# Fitting the model
gbt.fit(train.features, train.target)
# Evaluating the model
gbt.score(test.features, test.target)
三、最佳實踐
在決策樹分箱中,有幾個最佳實踐可供參考:
- 不用量化變量,因為二元分支本身已經為描述者和每個分段的數據集定義了大小
- 每個箱體中有足夠的數據
- 每個箱體的大小足夠平均
- 箱體數量根據樣本數據的大小適當調整,通常取 5-20 個
- 避免使用限定和硬編碼的分界點,因為它們毫無疑問都是不可維護的
此外,在最大化性能時,應謹慎使用交叉驗證。由於分箱與特定的數據集有關,因此使用交叉驗證針對不同的數據集可能會導致更低的性能。為避免過多擬合或欠擬合而使性能更穩定,建議使用正確的分箱方法。
四、結論
通過文章的分析,我們發現決策樹分箱是提高模型性能的有效方式之一。但在使用之前,一定要注意分箱無效、過擬合和欠擬合等問題。在實踐中,我們應該充分利用強大的機器學習庫,如scikit-learn和pyspark.ml,來完成分箱的工作並據此提高機器學習模型的性能。
原創文章,作者:MIGJM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332916.html