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