【scikit-learn基础】--『预处理』之 缺失值处理
數(shù)據(jù)的預(yù)處理是數(shù)據(jù)分析,或者機(jī)器學(xué)習(xí)訓(xùn)練前的重要步驟。
通過(guò)數(shù)據(jù)預(yù)處理,可以
- 提高數(shù)據(jù)質(zhì)量,處理數(shù)據(jù)的缺失值、異常值和重復(fù)值等問(wèn)題,增加數(shù)據(jù)的準(zhǔn)確性和可靠性
- 整合不同數(shù)據(jù),數(shù)據(jù)的來(lái)源和結(jié)構(gòu)可能多種多樣,分析和訓(xùn)練前要整合成一個(gè)數(shù)據(jù)集
- 提高數(shù)據(jù)性能,對(duì)數(shù)據(jù)的值進(jìn)行變換,規(guī)約等(比如無(wú)量綱化),讓算法更加高效
本篇介紹的缺失值處理,是數(shù)據(jù)預(yù)處理中非常重要的一步,因?yàn)楹芏鄼C(jī)器學(xué)習(xí)算法都假設(shè)數(shù)據(jù)是完整的,算法的執(zhí)行過(guò)程中沒(méi)有考慮缺失值的影響。
所以,為了提高數(shù)據(jù)質(zhì)量、改進(jìn)數(shù)據(jù)分析結(jié)果、提高數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)的效果,缺失值處理必不可少。
1. 原理
處理缺失值的手段大致有4類:
- 刪除存在缺失值數(shù)據(jù)行
- 填充缺失值
- 不處理缺失值
- 用深度學(xué)習(xí)方法處理
1.1. 刪除缺失值數(shù)據(jù)
刪除缺失值是最簡(jiǎn)單的一種處理方式,不過(guò),在某些情況下,這可能會(huì)導(dǎo)致數(shù)據(jù)的大量丟失。
如果數(shù)據(jù)丟失過(guò)多,可能會(huì)改變數(shù)據(jù)的分布,影響模型的準(zhǔn)確性。
所以,只有在缺失值占比很小的情況下,才會(huì)考慮使用這種處理方式。
刪除缺失值用pandas庫(kù)的方法即可,比如:
import pandas as pd
df = pd.util.testing.makeMissingDataframe()
print("刪除前: {} 行".format(len(df)))
df = df.dropna()
print("刪除后: {} 行".format(len(df)))
# 運(yùn)行結(jié)果
刪除前: 30 行
刪除后: 19 行
1.2. 填充缺失值
直接刪除存在缺失值的數(shù)據(jù)行雖然簡(jiǎn)單,但是在實(shí)際應(yīng)用中,使用的并不多。
實(shí)際情況下,使用最多的還是填充缺失值。
scikit-learn庫(kù)中,填充缺失值的方式主要有:
1.2.1. 均值填充
均值填充就是用缺失值所在列的平均值來(lái)填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("均值填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="mean")
data = imp.fit_transform(data)
print("均值填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
均值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
均值填充后:
[[1. 2. 3. ]
[4. 5. 6. ]
[7. 8. 4.5]]
填充的5和4.5分別是第二列和第三列的平均值。
1.2.2. 中位數(shù)填充
中位數(shù)填充就是用缺失值所在列的中位數(shù)來(lái)填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("中位數(shù)填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="median")
data = imp.fit_transform(data)
print("中位數(shù)填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
中位數(shù)填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
中位數(shù)填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 6.]
[10. 11. 12.]]
填充的8和6分別是第二列和第三列的中位數(shù)。
1.2.3. 眾數(shù)填充
眾數(shù)填充就是用缺失值所在列的眾數(shù)數(shù)來(lái)填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 8, 3]])
print("眾數(shù)填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="most_frequent")
data = imp.fit_transform(data)
print("眾數(shù)填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
眾數(shù)填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 8. 3.]]
眾數(shù)填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 3.]
[10. 8. 3.]]
填充的8和3分別是第二列和第三列的眾數(shù)。
1.2.4. 常量填充
常量填充就是用指定的常量來(lái)填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("常量填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, fill_value=100, strategy="constant")
data = imp.fit_transform(data)
print("常量填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
常量填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
常量填充后:
[[ 1. 2. 3.]
[ 4. 100. 6.]
[ 7. 8. 100.]]
缺失值用常量100填充了。
1.2.5. 插值填充
插值填充就是使用線性插值或多項(xiàng)式插值等方法,基于已知的數(shù)據(jù)點(diǎn)估計(jì)缺失值。
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("插值填充前:\n{}".format(data))
imp = IterativeImputer(max_iter=10, random_state=0)
data = imp.fit_transform(data)
print("插值填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
插值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
插值填充后:
[[1. 2. 3. ]
[4. 5.00203075 6. ]
[7. 8. 8.99796726]]
1.2.6. K近鄰填充
K近鄰填充就是利用K近鄰算法,找到與缺失值最近的K個(gè)數(shù)據(jù)點(diǎn),用它們的值的平均數(shù)或中位數(shù)來(lái)填充缺失值。
from sklearn.impute import KNNImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("K近鄰填充前:\n{}".format(data))
imp = KNNImputer(n_neighbors=2)
data = imp.fit_transform(data)
print("K近鄰填充后:\n{}".format(data))
# 運(yùn)行結(jié)果
K近鄰填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
K近鄰填充后:
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]]
2. 作用
缺失值處理的主要作用包括:
- 提高數(shù)據(jù)完整性和準(zhǔn)確性:如果數(shù)據(jù)中存在缺失值,可能會(huì)影響分析的準(zhǔn)確性,甚至導(dǎo)致錯(cuò)誤的結(jié)論。因此,通過(guò)填補(bǔ)缺失值,我們可以確保數(shù)據(jù)的完整性和準(zhǔn)確性。
- 提升數(shù)據(jù)質(zhì)量:缺失值可能會(huì)降低數(shù)據(jù)的質(zhì)量,使得數(shù)據(jù)分析變得更為困難。通過(guò)處理缺失值,我們可以提升數(shù)據(jù)的質(zhì)量,使得分析結(jié)果更加可靠。
- 提高算法性能:許多機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘算法在處理不完整數(shù)據(jù)時(shí)性能會(huì)下降。處理缺失值可以使得這些算法更好地運(yùn)行,提高其性能。
- 減少信息丟失:在某些情況下,缺失值可能代表著某些信息的丟失。通過(guò)對(duì)這些缺失值進(jìn)行處理,我們可以盡量減少信息丟失的數(shù)量。
- 消除或減少噪聲:缺失值的存在可能會(huì)引入數(shù)據(jù)中的噪聲,這種噪聲可能會(huì)對(duì)數(shù)據(jù)分析產(chǎn)生干擾,甚至影響模型的訓(xùn)練效果。通過(guò)填補(bǔ)這些缺失值,我們可以消除或減少這種噪聲。
3. 總結(jié)
在選擇處理缺失值的方法時(shí),需要考慮數(shù)據(jù)的性質(zhì)、缺失值的比例、數(shù)據(jù)的分布以及具體的分析任務(wù)等因素。
同時(shí),不同的方法可能適用于不同的場(chǎng)景,需要結(jié)合具體情況進(jìn)行選擇。
總結(jié)
以上是生活随笔為你收集整理的【scikit-learn基础】--『预处理』之 缺失值处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 语义化的HTML结构有哪些对于对网站的优
- 下一篇: 如果让你来设计消息加密