Python 在每一行熊猫数据帧上有没有更快的方法来训练IsolationForest?

Python 在每一行熊猫数据帧上有没有更快的方法来训练IsolationForest?,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我有一个Pandas数据框,其中包含30天内2000个终端的事务计数(列为每月的第几天),数据框如下所示: trx.head() 终端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

我有一个Pandas数据框,其中包含30天内2000个终端的事务计数(列为每月的第几天),数据框如下所示:

trx.head()
终端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对我的每一行数据进行异常检测

首先,我将每一行转换为一个新的数据框,并在该数据框上逐个拟合数据,然后将结果添加到列表中:

def查找异常(trx1,异常值分数):
scaler=StandardScaler()
np_scaled=缩放器拟合变换(trx1)
数据=局部数据帧(np_比例)
#列车隔离林
模型=隔离林(污染=异常值\分数)
模型拟合(数据)
trx1[‘异常’]=pd.系列(模型预测(数据))
返回(trx1)
#这对我来说太慢了
列表\u终端\u trx=[]
对于范围(0,len(trx)-1)内的i:
trx1=trx.iloc[i,1:][.reset_index()
trx1.columns=['day','count']
trx1['day']=trx1['day'].aType(浮动)
列表\终端\ trx.append(查找\异常(trx1,异常值\分数))
打印(‘为记录而学习’,i)
上面的代码运行良好,但速度很慢,我想知道是否有更好的方法

Edited1:感谢您的建议,我将n_jobs=-1设置为1,现在速度更快了,但是除了for循环,还有其他选择吗


Edited2:经过一些修改,我使用了建议使用的apply(),但没有性能差异: 对于版本,时间为3:29:00 应用版本需要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

你为什么要在每一排训练你的模特?我所看到的示例在完整数据集上训练这里给出的示例在完整数据上训练模型:@ClockSlave每行是一个不同的终端(商户),具有不同的行为和模式,把每一行看作一个不同的数据系列。谢谢你的建议,它快得多,但是我的for循环还有别的选择吗?更新了解决方案。无法尝试使用真实数据,但理论上,当我在visual studio代码Jupyter Server(python交互窗口)中使用n_jobs=-1时,它应该可以工作。它工作正常,但当我点击F5(开始调试)时,它崩溃。经过一些修改,我使用了apply()但我没有发现性能差异:对于版本需要3:29:00应用版本需要3:25:28,您可以尝试并行应用和/或对forest warm_start=True使用参数化