存在问题
获取未经处理的原始数据,可能有以下问题:
- 不属于同一量纲:即数据的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
- 信息冗余:对于某些定量数据,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
- 定性特征不能直接使用:某些机器学习算法和模型只能接受定量数据的输入,那么需要将定性数据转换为定量数据。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。
- 存在缺失值:缺失值需要补充。
- 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
处理方式
在处理数据前,会先查看其基本信息。然后进行无量纲化,对定量特征二值化,对定性特征哑编码,缺失值计算,数据变换等操作。
基本信息
一般的数据分析都需要先了解数据的基本信息,比如缺失值情况、数值的平均、标准差等。
基本信息可以直观的告诉我数据中是否有明显的问题,使用pandas可以一步得到这个总结。
# 对数据进行基本的检查
# 得到数据的形状
n_df = df.shape[0]
print ("共有{row}行{col}列数据".format(
row=df.shape[0],
col=df.shape[1]))
# 得到数据的总结信息
summary_df = df.describe()
# 得到变量列表,得到格式为list
cols = df.columns.tolist()
输出如下:
Out[]36:共有18行5列数据
In [37]: summary_df
Out[37]:
duration_log count_log max_base max_hour max_day
count 18.000000 18.000000 18.000000 18.000000 1.800000e+01
mean 15.676040 6.966977 2.944444 11.222222 2.017098e+07
std 1.906317 1.755471 2.312936 6.292438 5.732390e+01
min 11.482951 2.944439 1.000000 1.000000 2.017081e+07
25% 15.140543 6.487231 1.000000 6.750000 2.017101e+07
50% 16.005462 7.381930 2.000000 10.000000 2.017101e+07
75% 16.591520 8.298575 4.750000 16.000000 2.017101e+07
max 18.878600 8.673855 8.000000 23.000000 2.017101e+07
In [38]: cols
Out[38]: ['duration_log', 'count_log', 'max_base', 'max_hour', 'max_day']
缺失值
很多真实数据中,因为各种各样的原因大量数据都缺失了。在进行任何严肃的数据分析前,我们一般都需要先检查数据缺失的情况。
# 缺失值处理
# 计算每个变量的缺失值
for col in cols:
missing = n_df - np.count_nonzero(df[col].isnull().values)
mis_perc = 100 - float(missing) / n_df * 100
print ("{col}的缺失比例是{miss}%".format(col=col,miss=mis_perc))
输出如下:
共有20行5列数据
duration_log的缺失比例是10.0%
count_log的缺失比例是10.0%
max_base的缺失比例是10.0%
max_hour的缺失比例是10.0%
max_day的缺失比例是10.0%
可以看出各个属性的缺失情况
可以将缺失值删去,或者填补
# 将整个文件中的缺失值用0代替
df.fillna(value=0, inplace=True)
# 将note这个变量中的缺失值用0代替
df['notes'].fillna(value=0, inplace=True)
#删除缺失的行
df.dropna(axis=0, how='any')
关于dropna()
参数
axis : {0 or ‘index’, 1 or ‘columns’}, or tuple/list thereof
Pass tuple or list to drop on multiple axes
how : {‘any’, ‘all’}
any : if any NA values are present, drop that label
all : if all values are NA, drop that label
thresh : int, default None
int value : require that many non-NA values
subset : array-like Labels along other axis to consider, e.g. if you are dropping rows these would be a list of columns to include
inplace : boolean, default False
If True, do operation inplace and return None.
关于缺失值补全
常用的方法如下:
- 均值补全
- 中位数补全
- 趋势补全
- ......等
将多个描述型变量一次性转为数值型
大部分机器学习算法要求输入的数据必须是数字,不能是字符串。
我们在不假设分类器的前提下,往往需要将描述变量转化为数字型变量,因为大部分算法无法直接处理描述变量。
# 寻找描述变量
# 将描述变量储存到 cat_vars这个list中去
cat_vars = []
print ("\n描述变量有:")
for col in cols:
if df[col].dtype == "object":
print (col)
cat_vars.append(col)
使用LabelEncoder 转化
print ("\n开始转换描述变量...")
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
# 将描述变量自动转化为 数值型变量
# 并将转化为的数据附加到原始数据上
for col in cat_vars:
tran = le.fit_transform(df[col].tolist())
tran_df = pd.DataFrame(tran, columns=['num_'+col])
print("{col}经过转化为{num_col}".format(col=col,num_col='num_'+col))
# print (le.classes_)
df = pd.concat([df, tran_df], axis=1)
无量纲化
无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。
标准化
标准化需要计算特征的均值和标准差,公式表达为:
使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:
from sklearn.preprocessing import StandardScaler
#标准化,返回值为标准化后的数据
StandardScaler().fit_transform(df)
区间缩放法
区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:
使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:
from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
MinMaxScaler().fit_transform(df)
归一化
归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:
使用preproccessing库的Normalizer类对数据进行归一化的代码如下:
from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(df)
ref:
Python机器学习中的实用小操作(一):数据清理篇
https://zhuanlan.zhihu.com/p/29893734
十分钟搞定pandas
https://www.cnblogs.com/chaosimple/p/4153083.html