簡體   English   中英

鏈中分類器的堆疊集合

[英]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機動的( drivingmotor-bike )還是非機動的( ridingwalking )。 學習階段應該像這樣進行: 在此處輸入圖像描述

所以我添加了一個列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還是ridingDecision Tree ,以及預測活動是driving還是motor-bikeSVC 元分類器 ( DT, SVC ) 將作為輸入,第一個分類器的 4 個特征 + 概率輸出。 顯然, DTSVC只會采用與他們預測的類相對應的整個數據集的一個子集。

我對學習過程有這個想法,但我不確定如何實施它。

那里的任何人都可以展示如何做到這一點嗎?

使用核心 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM