机器学习中是否有一种方法可以填补缺失值?

6

为了丰富个人知识,我一直在尝试不同于平均数/中位数/众数的缺失值填充方法。到目前为止,我已经尝试了KNN、MICE和中位数填充方法。我被告知可以使用聚类方法进行填充,但是我的互联网搜索只找到了研究论文,没有找到能够实现此功能的软件包。

我正在对Iris数据集运行这些填充方法,通过有意制造缺失值(因为Iris数据集本身没有缺失值)。我的其他方法如下:

data = pd.read_csv("D:/Iris_classification/train.csv")

#Shuffle the data and reset the index
from sklearn.utils import shuffle
data = shuffle(data).reset_index(drop = True)  

#Create Independent and dependent matrices
X = data.iloc[:, [0, 1, 2, 3]].values 
y = data.iloc[:, 4].values

#train_test_split
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 50, random_state = 0)

#Standardize the data
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()

X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

#Impute missing values at random
prop = int(X_train.size * 0.5) #Set the % of values to be replaced
prop1 = int(X_test.size * 0.5)

a = [random.choice(range(X_train.shape[0])) for _ in range(prop)] #Randomly choose indices of the numpy array
b = [random.choice(range(X_train.shape[1])) for _ in range(prop)]

X1_train[a, b] = np.NaN
X1_test[c, d] = np.NaN

然后针对KNN插补,我已经完成了
X_train_filled = KNN(3).complete(X_train)
X_test_filled = KNN(3).complete(X_test

有没有一种用聚类方法来补充缺失值的方式?同时,当数据中存在NaN值时,StandardScaler()无法工作。是否有其他方法来对数据进行标准化?


它对你有效吗? - Mihai Alexandru-Ionut
我不确定你提供的答案是否是我正在寻找的答案。如果我没有错的话,它似乎是通过均值插补的结果。 - uharsha33
2个回答

1
我们需要处理的主要问题是存在缺失数据的情况。
首先,我需要告诉您,删除“问题”行可能非常危险,因为它们可能包含关键信息。

有没有一种方法可以通过聚类来填补缺失值?

是的,您可以用该列所有值的平均值替换缺失数据。
您可以使用sklearn.preprocessing库中的Inputer类来完成此操作。
from sklearn.preprocessing import Imputer
inputer = Inputer(missing_values = 'NaN', strategy = 'mean', axis = 0)
inputer = inputer.fit(X)
X = inputer.transform(X)

在“创建独立和依赖矩阵”之后,但在缩放和其他操作之前,您必须使用此方法。

我为您创建了一个简单的示例,以便向您展示它的工作原理:

之前

enter image description here

之后

enter image description here


0

你看过 fancyimpute https://github.com/iskandr/fancyimpute 这个包吗?它提供了 KNN,MICE,矩阵分解等几种方法。

还有一个叫做 impyute https://github.com/eltonlaw/impyute 的包,我个人没有使用过,但是在 SciPy 上的一位演讲者告诉我,在 fancyimpute 无法编译时他使用了这个包。它的文档比 fancyimpute 更好,虽然选项少了一些。

除此之外,在 Python 中并没有太多优秀的插值库。在这方面,R 真的比 Python 更出色,拥有像 Amelia 和 MICE 这样的优秀的插值包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接