簡體   English   中英

有沒有一種更快的方法來在熊貓DataFrame的每一行上訓練IsolationForest?

[英]is there a faster way for Training IsolationForest on each row of pandas DataFrame?

我有一個Pandas DataFrame,其中包含30天的2000個終端的交易計數(列是一個月中的一天)DataFrame看起來像這樣:

trx.head()
    TerminalID 8881 8882    8883    8884    8885    8886    ... 
0   11546   0.0 0.0 0.0 0.0 0.0 0.0 ... 
1   200002  0.0 0.0 0.0 0.0 0.0 0.0 ... 
2   200512  1.0 0.0 0.0 1.0 1.0 0.0 ...
3   202630  3.0 1.0 1.0 0.0 1.0 1.0 ...
4   207000  2.0 4.0 1.0 6.0 3.0 7.0 ...

我想使用IsolationForest對數據的每一行進行異常檢測。

首先,我將每一行轉換為新的DataFrame並在其上擬合數據,每一行一個接一個,然后將結果添加到列表中:

def find_anomaly(trx1,outliers_fraction):
    scaler = StandardScaler()
    np_scaled = scaler.fit_transform(trx1)
    data = pd.DataFrame(np_scaled)
    # train isolation forest
    model =  IsolationForest(contamination=outliers_fraction)
    model.fit(data) 
    trx1['anomaly'] = pd.Series(model.predict(data))
    return(trx1)
#This for is slow
list_terminal_trx = []
for i in range(0,len(trx)-1):
    trx1=trx.iloc[i,1:].reset_index()
    trx1.columns=['day','count']
    trx1['day']=trx1['day'].astype(float)
    list_terminal_trx.append(find_anomaly(trx1,outliers_fraction))
    print('Learning for record',i)

上面的代碼工作正常,但是很慢,我想知道是否有更好的方法?

Edited1:感謝@AT_asks建議我將n_jobs = -1設置為現在,它更快,但是我的for循環還有其他選擇嗎?

Edited2:經過一些修改,我使用了@AT_asks建議使用apply()的方法,但沒有任何性能差異:對於版本需要3:29:00 Apply版本需要3:25:28

Edited3:使用iterrows()代替for會帶來相同的結果:每個循環3分鍾16s±0 ns(平均±標准偏差,運行1次,每個循環1次)

如果添加此參數,您可能會得到一些改進

model =  IsolationForest(contamination=outliers_fraction, n_jobs=-1)

另外,我們可以嘗試一下。

# Do not create instance every time
scaler = StandardScaler()

def find_anomaly(trx1,outliers_fraction):    
    np_scaled = scaler.fit_transform(trx1)
    data = pd.DataFrame(np_scaled)
    # train isolation forest
    model =  IsolationForest(contamination=outliers_fraction, n_jobs=-1)
    model.fit(data) 
    trx1['anomaly'] = pd.Series(model.predict(data))
    return(trx1)

# not loop but apply
list_terminal_trx = trx.apply(lambda x: find_anomaly(x,outliers_fraction), axis =1).values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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