一冲茸、缺失值處理
- 數(shù)據(jù)缺失主要包括記錄缺失和字段信息缺失等情況奠涌,其對數(shù)據(jù)分析會有較大影響邪乍,導(dǎo)致結(jié)果不確定性更加顯著
-
缺失值處理方法:
- 丟棄 → 刪除
- 插補(bǔ) → 均值降狠、中位數(shù)对竣、眾數(shù)插補(bǔ) / 臨近值插補(bǔ) / 插值法
- 不處理
# 設(shè)置cell多行輸出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all' #默認(rèn)為'last'
# 導(dǎo)入相關(guān)庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import warnings
warnings.filterwarnings('ignore')
os.chdir(r'E:\python_learn\data')
file_name = 'iris-data.csv'
iris_data = pd.read_csv(file_name,engine='python')
iris_data.head()
image.png
本次缺失值處理使用的數(shù)據(jù)集為修改過的鳶尾花卉數(shù)據(jù),將對該數(shù)據(jù)集進(jìn)行缺失值處理處理喊熟。其中柏肪,
sepal_length_cm為花萼長度
sepal_width_com為花萼寬度
petal_length_cm為花瓣長度
petal_length_cm為花瓣寬度
class為鳶尾花類別
通過這4個數(shù)據(jù),能判斷并分類出3種鳶尾花的類別芥牌。
# 查看數(shù)基本結(jié)構(gòu)
iris_data.info()
# 一共150條數(shù)據(jù)烦味,5個字段
# 從返回基本結(jié)構(gòu)可以看到除了class字段,其他字段都含有缺失值
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
sepal_length_cm 147 non-null float64
sepal_width_cm 148 non-null float64
petal_length_cm 144 non-null float64
petal_width_cm 144 non-null float64
class 150 non-null object
dtypes: float64(4), object(1)
memory usage: 5.9+ KB
# 缺失值判斷
iris_data.isna().sum()
sepal_length_cm 3
sepal_width_cm 2
petal_length_cm 6
petal_width_cm 6
class 0
dtype: int64
1.1丟棄處理
(1)丟棄處理
→用pandas的dropna()方法壁拉,刪除含NaN的行或列
刪除帶缺失值記錄或列字段谬俄,雖減少缺失值對樣本的影響,但也意味著減少數(shù)據(jù)特征弃理。
-
@B邸!面對以下2種情況不宜丟棄處理缺失值:
- 缺失值超過比例較大痘昌,超過10%
- 帶缺失值的label標(biāo)簽主要集中于某一類或幾類钥勋,刪除會使樣本丟失大量特征信息
iris_dropna_1 = iris_data.dropna() # 缺失值刪除處理
# 默認(rèn)how=any,axis=0辆苔,行記錄任意出現(xiàn)NaN就刪除行記錄
iris_dropna_1.isna().sum()
iris_dropna_1.isna().sum().sum() # 缺失值檢查
sepal_length_cm 0
sepal_width_cm 0
petal_length_cm 0
petal_width_cm 0
class 0
dtype: int64
0
iris_dropna_2 = iris_data.dropna(how='all') # 缺失值刪除處理
# how=all算灸,當(dāng)整行記錄都為NaN才刪除記錄
iris_dropna_2.isna().sum()
iris_dropna_2.isna().sum().sum() # 缺失值檢查,發(fā)現(xiàn)并沒有刪除驻啤,表示不存在整行都為NaN的情況
sepal_length_cm 3
sepal_width_cm 2
petal_length_cm 6
petal_width_cm 6
class 0
dtype: int64
17
因本次演練數(shù)據(jù)集樣本量較少菲驴,不選擇刪除缺失值的處理方法
1.2插補(bǔ)處理
當(dāng)數(shù)據(jù)集不宜采用丟棄的方法處理缺失值時,可以使用插補(bǔ)的方法補(bǔ)全缺失值骑冗。
(1)均值/中位數(shù)/眾數(shù)插補(bǔ)
→ pandas的fillna()方法
iris_fillna_1 = iris_data.fillna(iris_data.median()) # 在不確定是否存在異常值時赊瞬,此處選擇時候中位數(shù)填補(bǔ)
iris_fillna_1.isna().sum()
sepal_length_cm 0
sepal_width_cm 0
petal_length_cm 0
petal_width_cm 0
class 0
dtype: int64
→ sklearn.impute的SimpleImputer數(shù)據(jù)預(yù)處理方法
from sklearn.impute import SimpleImputer
iris_nan_model = SimpleImputer(missing_values=np.nan,strategy='median') # 用中位數(shù)替換NaN
iris_nan_result = iris_nan_model.fit_transform(np.array(iris_data)[:,:4]) # 應(yīng)用模型,數(shù)據(jù)以數(shù)組形式傳入
iris_result = pd.DataFrame(iris_nan_result,columns=['sepal_length_cm','sepal_width_cm','petal_length_cm','petal_width_cm'])
iris_result.isna().sum()
iris_result.isna().sum().sum()
sepal_length_cm 0
sepal_width_cm 0
petal_length_cm 0
petal_width_cm 0
dtype: int64
0
(2)臨近值插補(bǔ)
→pandas的fillna()方法,設(shè)置method參數(shù)贼涩;method=ffill,用前面值替換NaN巧涧;method=bfill,用后面值替換NaN
iris_data.head()
iris_fillna_2 = iris_data.fillna(method='ffill')
iris_fillna_2.head()
iris_result.isna().sum()
iris_result.isna().sum().sum()
image.png
sepal_length_cm 0
sepal_width_cm 0
petal_length_cm 0
petal_width_cm 0
dtype: int64
0
(3)插值法
→ 拉格朗日插值法:將缺失函數(shù)值對應(yīng)的點x代入插值多項式得到缺失值的近似值L(x)
from scipy.interpolate import lagrange # 導(dǎo)入拉格朗日插值函數(shù)
iris_lagrange = iris_data.copy() # 復(fù)制一份原數(shù)據(jù),用于操作
print(iris_lagrange.head())
# 自定義列向量插值函數(shù)
# s為列向量遥倦,n為被插值的位置褒侧,k為取前后的數(shù)據(jù)個數(shù),默認(rèn)為5
def ployinterp_columnn(s,n,k=5):
y = s[list(range(n-k,n))+list(range(n+1,n+1+k))] # 取數(shù)
y = y[y.notna()] # 剔除空值
return lagrange(y.index,list(y))(n) # 插值并返回插值結(jié)果
# 逐個元素判斷是否需要插值
for i in iris_lagrange.columns:
for j in range(len(iris_lagrange)):
if (iris_lagrange[i].isna())[j]:
iris_lagrange[i][j] = ployinterp_columnn(iris_lagrange[i],j)
iris_lagrange.isna().sum()
iris_lagrange.isna().sum().sum() # 缺失值檢查
print(iris_lagrange.head())
sepal_length_cm sepal_width_cm petal_length_cm petal_width_cm \
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 NaN
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
class
0 Iris-setosa
1 Iris-setosa
2 Iris-setosa
3 Iris-setosa
4 Iris-setosa
sepal_length_cm 0
sepal_width_cm 0
petal_length_cm 0
petal_width_cm 0
class 0
dtype: int64
0
sepal_length_cm sepal_width_cm petal_length_cm petal_width_cm \
0 5.1 3.5 1.4 0.200000
1 4.9 3.0 1.4 0.200000
2 4.7 3.2 1.3 0.273333
3 4.6 3.1 1.5 0.200000
4 5.0 3.6 1.4 0.200000
class
0 Iris-setosa
1 Iris-setosa
2 Iris-setosa
3 Iris-setosa
4 Iris-setosa