Python 带scikit学习的KNI计算机

Python 带scikit学习的KNI计算机,python,scikit-learn,Python,Scikit Learn,我有一个发动机的测量,有14个不同的传感器,测量间隔为6秒,它是一个numpy阵列,有14列,大约5000行。每行代表一个测量点,每列代表一个特征 1%的数据集是NAN,我想将它们插补为SVM 因为数据集是一个动态引擎的时间序列,所以只需要查看缺失值的两个最近的数据点:一个在前面的数据点和一个在后面的数据点。它应该计算两个最近数据点的平均值 我原以为这在scikit learn的KNI计算机上是可能的,但当我有一整排NAN时,我并不满意。看看这个例子: 15.30 80.13 20

我有一个发动机的测量,有14个不同的传感器,测量间隔为6秒,它是一个numpy阵列,有14列,大约5000行。每行代表一个测量点,每列代表一个特征

1%的数据集是NAN,我想将它们插补为SVM

因为数据集是一个动态引擎的时间序列,所以只需要查看缺失值的两个最近的数据点:一个在前面的数据点和一个在后面的数据点。它应该计算两个最近数据点的平均值

我原以为这在scikit learn的KNI计算机上是可能的,但当我有一整排NAN时,我并不满意。看看这个例子:

15.30      80.13   20000.00   15000.00     229.00     698.00     590.00      24.00      82.53      1522.00     410.00     406.00     407.00      50.01
nan        nan        nan        nan        nan        nan        nan        nan        nan        nan        nan        nan        nan        nan
15.30      82.90   20000.00   15000.00     225.00     698.00     628.00      24.00      85.36    1523.00     410.00     407.00     408.00      50.02
KNI计算机的输出如下所示:

15.30      80.13   20000.00   15000.00     229.00     698.00     590.00      24.00      82.53    1522.00     410.00     406.00     407.00      50.01
19.90      91.88   19997.09   19945.58     327.14     829.40     651.23      25.97      94.80    1529.65     410.20     406.69     407.72      49.99
15.30      82.90   20000.00   15000.00     225.00     698.00     628.00      24.00      85.36    1523.00     410.00     407.00     408.00      50.02
看第一列,除了NaN:(15.30+15.30)/2=15.30之外,我会

相反,我得到了19.90分

我的代码:

from sklearn.impute import KNNImputer

imp = KNNImputer(n_neighbors=2)  
X_afterImputer = imp.fit_transform(X_beforeImputer)

有什么想法吗?

由于传递的n-近邻值较低,因此您似乎有很多噪音。但是,请记住,该方法不需要返回顶行和底行之间的平均值。使用数据训练的模型显然会有很多噪音,这会使它与您期望的值不同。(KNIMPUTE值的计算方式不是:
((x-1)+(x+1))/2
。相反,您可以尝试使用
。fillna(df.mean())
我为您制作了一个函数。下面是一个可复制的示例,以便您可以看到它是如何工作的:

将numpy导入为np
arr=np.random.randint(0,10,(10,4)).astype(float)
arr[2,0]=np.nan
arr[4,3]=np.nan
arr[0,2]=np.nan
打印(arr)
[[5.7.4]
[ 2.  6.  4.  9.]
[nan 2.5.5]
[ 7.  0.  3.  8.]
[6.4.3.nan]
[ 8.  1.  2.  0.]
[ 0.  0.  1.  1.]
[ 1.  2.  6.  6.]
[ 8.  1.  9.  7.]
[ 3.  5.  8.  8.]]
np.argwhere(np.isnan(arr))中x的
:
样本=arr[np.最大值(x[0]-1,0):np.最小值(x[0]+2,20),x[1]]
arr[x[0],x[1]]=np.均值(样本[np.逻辑\u非(np.isnan(样本)))
打印(arr)
[[5.7.4.4.]这里的第三个值是平均值(4)
[2.  6.  4.  9. ]
[4.5 2.5.5.]#这里的第一个值是平均值(2,7)
[7.  0.  3.  8. ]
[6.4.3.4.#这里的第四个值是平均值(8,0)
[8.  1.  2.  0. ]
[0.  0.  1.  1. ]
[1.  2.  6.  6. ]
[8.  1.  9.  7. ]
[3.  5.  8.  8. ]]
逻辑如下:

for every location (x, y) where value is missing:
    take previous and next value (if possible)
    assign the mean of these two values to the location (x, y)

我有最新版本的
sklearn
,此方法不可用,但这里有两条建议:

  • 使用:
    n\u邻居=1

  • 使用
    pandas


如果你通过n=1怎么办?@mkrieger1相同的结果找到了一个解决方案:无论如何谢谢你的回答;)重复的@mkrieger1 OP特别说他使用了一个NumPy数组存储库,但是对于n_邻居=1,我得到了相同的结果。对于pandas,它将得到整个列的平均值,我只需要前面和后面hanks值的平均值,但是对于pandas,它将得到整个列的平均值,我只需要前面和后面hanks值的平均值
X = np.array([[2, np.nan], [3, 4], [np.nan, 6], [8, 8]]) 
array([[ 2., nan],
       [ 3.,  4.],
       [nan,  6.],
       [ 8.,  8.]])

X=pd.DataFrame(X)
X = X.fillna(X.mean())
X.values
array([[2.        , 6.        ],
       [3.        , 4.        ],
       [4.33333333, 6.        ],
       [8.        , 8.        ]])