隔离林值的长度与索引的长度不匹配
Posted
技术标签:
【中文标题】隔离林值的长度与索引的长度不匹配【英文标题】:Isolation Forest Length of values does not match length of index 【发布时间】:2020-05-29 15:30:07 【问题描述】:我正在运行隔离林,试图将其应用于 10049972 行 x 19 列的数据库,但运行 2 小时后出现以下错误。我真的不明白为什么会得到它,也不知道如何解决?
代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import IsolationForest
df = pd.read_csv('D:\\Project\\database\\4-Final\\Final After.csv',low_memory=True)
iForest = IsolationForest(behaviour='new', n_estimators=80, contamination='auto' , max_samples=150)
df['anomaly'] = iForest.fit_predict(df.values.reshape(-1,1))
df=df.drop(df['anomaly'==-1],inplace=True)
df.to_csv('D:\\Project\\database\\4-Final\\IF TEST.csv', index=False)
错误是:
ValueError Traceback (most recent call last)
<ipython-input-1-fc55c8b1f328> in <module>
16
17
---> 18 df['anomaly'] = iForest.fit_predict(df.values.reshape(-1,1))
19
20
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
3368 else:
3369 # set column
-> 3370 self._set_item(key, value)
3371
3372 def _setitem_slice(self, key, value):
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value)
3443
3444 self._ensure_valid_index(value)
-> 3445 value = self._sanitize_column(key, value)
3446 NDFrame._set_item(self, key, value)
3447
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _sanitize_column(self, key, value, broadcast)
3628
3629 # turn me into an ndarray
-> 3630 value = sanitize_index(value, self.index, copy=False)
3631 if not isinstance(value, (np.ndarray, Index)):
3632 if isinstance(value, list) and len(value) > 0:
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\construction.py in sanitize_index(data, index, copy)
517
518 if len(data) != len(index):
--> 519 raise ValueError('Length of values does not match length of index')
520
521 if isinstance(data, ABCIndexClass) and not copy:
ValueError: Length of values does not match length of index
谢谢。
【问题讨论】:
【参考方案1】:我认为问题可能出在
df.values.reshape(-1,1)
看看这个例子
df = pd.DataFrame([(.2, .3), (.0, .6), (.6, .0), (.2, .1)], columns=['dogs', 'cats'])
df
dogs cats
0 0.2 0.3
1 0.0 0.6
2 0.6 0.0
3 0.2 0.1
df.values.reshape(-1,1)
array([[0.2],
[0.3],
[0. ],
[0.6],
[0.6],
[0. ],
[0.2],
[0.1]])
因此,您最终为fit_predict
提供了一个shape (n_samples*n_feature, 1)
向量,并且您将生成的shape (n_samples*n_feature,)
作为一列插入到带有shape (n_samples,n_feature)
的df
。行数不匹配。
【讨论】:
那我做错了吗?那么我正在做的是将所有 19 列合并为 1 并应用隔离林?因此,要单独在每一列上应用隔离林,我需要将它们分开并在每一列上一一应用隔离林? 为什么需要合并列? Isolationforest 将根据输入特征(列)返回每个样本(行)的异常分数。您可以在docs 获取更多信息,只需执行df['anomaly'] = iForest.fit_predict(df)
所以在使用 df['anomaly'] = iForest.fit_predict(df) 之后,我收到以下错误,对于df=df.drop(df['anomaly'==-1],inplace=True
) 行,错误是KeyError: False
。我应该将其更改为df=df.drop(df['anomaly'==-1].index,inplace=True
) 吗?
没有像 df['anomaly'==-1]
这样的语法,我会做像 df = df[df['anomaly'] != -1]
这样的语法以上是关于隔离林值的长度与索引的长度不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Pandas ValueError:值的长度与索引的长度不匹配 - 创建新列