带scikitlearn的KNI计算机

2024-03-28 08:51:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用14个不同的传感器对一台发动机进行了测量,测量间隔为6秒,显示为一个由14列和大约5000行组成的numpy数组。每一行代表一个测量点,每一列代表一个特征。在

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计算机的输出如下所示:

^{pr2}$

看第一列,除了NaN:(15.30+15.30)/2=15.30

结果我得了19.90分。在

我的代码:

^{3}$

有什么想法吗?在


Tags: 数据numpy间隔计算机代表传感器特征数组
3条回答

我给你做了个功能。下面是一个可复制的示例,这样您就可以看到它是如何工作的:

import numpy as 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

print(arr)
^{pr2}$
for x in np.argwhere(np.isnan(arr)):
    sample = arr[np.maximum(x[0] - 1, 0):np.minimum(x[0] + 2, 20), x[1]]
    arr[x[0], x[1]] = np.mean(sample[np.logical_not(np.isnan(sample))])
print(arr)
[[5.  7.  4.  4. ] # 3rd value here is mean(4)
 [2.  6.  4.  9. ]
 [4.5 2.  5.  5. ] # first value here is mean(2, 7)
 [7.  0.  3.  8. ]
 [6.  4.  3.  4. ] # 4th value here is mean(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_neighbors=1

  • 使用pandas

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.        ]])

您似乎有很多噪音,因为您传递的n邻居值很低。但是,请记住,该方法不需要返回顶行和底行之间的平均值。用数据训练的模型,显然会有很多噪声,这会使它与您期望的值不同。(KNIMPUTE值不计算为:((x-1) + (x+1))/2。相反,您可以尝试使用.fillna(df.mean())

相关问题 更多 >