[英]Stacking ensemble of classifiers in a chain
我有以下人類活動識別樣本數據集:
df = pd.DataFrame(
{
'mean_speed': [40.01, 3.1, 2.88, 20.89, 5.82, 40.01, 33.1, 40.88, 20.89, 5.82, 40.018, 23.1],
'max_speed': [70.11, 6.71, 7.08, 39.63, 6.68, 70.11, 65.71, 71.08, 39.63, 13.68, 70.11, 35.71],
'max_acc': [17.63, 2.93, 3.32, 15.57, 0.94, 17.63, 12.93, 3.32, 15.57, 0.94, 17.63, 12.93],
'mean_acc': [5.15, 1.97, 0.59, 5.11, 0.19, 5.15, 2.97, 0.59, 5.11, 0.19, 5.15, 2.97],
'activity': ['driving', 'walking', 'walking', 'riding', 'walking', 'driving', 'motor-bike',
'motor-bike', 'riding', 'riding', 'motor-bike', 'riding']
}
)
df.head()
mean_speed max_speed max_acc mean_acc activity
0 40.01 70.11 17.63 5.15 driving
1 3.10 6.71 2.93 1.97 walking
2 2.88 7.08 3.32 0.59 walking
3 20.89 39.63 15.57 5.11 riding
4 5.82 6.68 0.94 0.19 walking
所以我想在管道中創建一系列機器學習分類器。 基礎分類器首先預測一項activity
是機動的( driving
、 motor-bike
)還是非機動的( riding
、 walking
)。 學習階段應該像這樣進行:
所以我添加了一個列type
,說明活動是機動的還是其他的。
class_mapping = {'driving':'motorised', 'motor-bike':'motorised', 'walking':'non-motorised', 'riding':'non-motorised'}
df['type'] = df['activity'].map(class_mapping)
df.head()
mean_speed max_speed max_acc mean_acc activity type
0 40.01 70.11 17.63 5.15 driving motorised
1 3.10 6.71 2.93 1.97 walking non-motorised
2 2.88 7.08 3.32 0.59 walking non-motorised
3 20.89 39.63 15.57 5.11 riding non-motorised
4 5.82 6.68 0.94 0.19 walking non-motorised
題:
我想訓練一個Random Forest
作為基礎分類器,以預測一項活動是motorised
的還是non-motorised
,並具有概率輸出。 然后是 2 個元分類器:預測活動是walking
還是riding
的Decision Tree
,以及預測活動是driving
還是motor-bike
的SVC
。 元分類器 ( DT, SVC
) 將作為輸入,第一個分類器的 4 個特征 + 概率輸出。 顯然, DT
和SVC
只會采用與他們預測的類相對應的整個數據集的一個子集。
我對學習過程有這個想法,但我不確定如何實施它。
那里的任何人都可以展示如何做到這一點嗎?
使用核心 Scikit-Learn 類不可能實現您的要求。 但是,如果您對使用某些第 3 方軟件包的想法持開放態度,那么一點也不難。
首先,使用與機動化/非機動化決策概率相對應的特征豐富您的數據集:
from sklego.preprocessing import IdentityTransformer
from sklego.meta import EstimatorTransformer
feature_estimator = FeatureUnion([
("identity", IdentityTransformer()),
("type_estimator", EstimatorTransformer(RandomForestClassifier(), predict_func = "predict_proba"))
])
這會將兩列(對應於 RandomForestClassifier.predict_proba(X) 的輸出)附加到原始數據矩陣。
其次,建立最終的分類器集成。 使用“機動”類的概率來做出決定(例如,應用 75% 的閾值)。 請注意,此“標志”功能的索引是倒數第二個,即。 X[-2].
from sklearn2pmml.ensemble import EstimatorChain
final_estimator_chain = EstimatorChain([
("motorized", SVC(), "X[-2] >= 0.75"),
("non-motorized", DecisionTreeClassifier(), "X[-2] < 0.75"),
], multioutput = False)
把所有東西放在一起:
pipeline = Pipeline([
("step_one", feature_estimator),
("step_two", final_estimator_chain)
])
pipeline.fit(X, y)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.