天天看点

数据预处理总结1特征缩放缺失值处理

特征缩放

标准化

使数据服从标准正态分布,均值为0,方差为1。

做数据挖掘,pandas和numpy库肯定是要引入的,这里就省略了。

from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings("ignore")

mydata = pd.DataFrame([[-1,2],[-0.5,6],[0,10],[1,18]])

sca = StandardScaler()
res = sca.fit_transform(mydata)
print(res)
           

StandardScaler: 缺失值保持不变;不能传入一维数组;比较常用,因为异常值对其影响小。

归一化

把数据缩放到一个特定的取值范围,默认[0,1]

from sklearn.preprocessing import MinMaxScaler

mydata = pd.DataFrame([[-1,2],[-0.5,6],[0,10],[1,18]])

# 归一化到[0,1]
sca = MinMaxScaler()
res = sca.fit_transform(mydata)
print(res)

# 归一化到其他范围
sca = MinMaxScaler(feature_range=(10,20))
res = sca.fit_transform(mydata)
print(res)
           

MinMaxScaler: 缺失值保持不变;不能传入一维数组;适用于数据范围需要转化到特定区间。

不破坏稀疏性的缩放

用每个数除以最大的绝对值,把数据缩放到[-1,1],0保持不变。

from sklearn.preprocessing import MaxAbsScaler

mydata = pd.DataFrame([[-1,2],[-0.5,6],[0,10],[1,18]])

sca = MaxAbsScaler()
res = sca.fit_transform(mydata)
print(res)
           

MaxAbsScaler: 适用于数据范围压缩到[-1,1],且不破坏数据的稀疏性。

减少异常值影响的缩放

使用的是中位数、四分位数范围(IQR),可以减小异常值、极端值的影响。

from sklearn.preprocessing import RobustScaler

mydata = pd.DataFrame([[-1,2],[-0.5,6],[0,10],[1,18]])

sca = RobustScaler()
res = sca.fit_transform(mydata)
print(res)
           

适用于异常值多、噪声多的情况。

缺失值处理

读取数据

mydata = pd.read_csv("xxx.csv",index_col=0)
mydata.head()
           

查看缺失值(空值)分布在哪些列

mydata.info()
           

查看缺失值的比例

mydata.Age.isnull().value_counts()
mydata.Age.isnull().value_counts(normalize = True)
           

填充缺失值

以下两种写法都可以,我个人偏好第二种。

mydata.Age = mydata.Age.fillna(mydata.Age.median())
mydata.Age.fillna(mydata.Age.median(), inplace=True)
           

复习一下中位数、平均值、众数的写法:

mydata.median() # 默认按列求
mydata.median(axis=1) # 按行求
mydata.median(numeric_only=True)

mydata.mean()

mydata.mode()
           

删除缺失值

df.dropna() # 默认删除带有空值的行
df.dropna(axis = 1) # 删除带有空值的列
df.dropna(inplace = True) # 直接修改原数据
df.dropna(how = ‘all’) # 只有所有值都为空时,才删除该行(列)
           

继续阅读