Python 数据预处理

存在问题

获取未经处理的原始数据,可能有以下问题:

  • 不属于同一量纲:即数据的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
  • 信息冗余:对于某些定量数据,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“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的归一化公式如下:


image.png

使用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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容