大家好 我是小k 入手机器学习也快一个月了 接触到了很多关于机器学习的知识 但大多都只是停留在认知阶段 从今天起 想逐步的更加深层次的了解学习机器学习 我会不定时的在平台上发一些学习到自认为有用的知识和大家分享(模板内容参照Avik Jain) 今天简单和大家谈谈数据预处理部分
第一步:导入库
import numpy as np
import pandas as pd
第二步:加载数据集
这里我选择的数据集是在DC竞赛平台上租金预测新手赛的训练集 链接如下https://js.dclab.run/v2/cmptDetail.html?id=361
data = pd.read_csv(r'C:\Users\admin\Desktop\train.csv')
print(data.head())#审查数据集前五行
运行结果如下:
ID 位置 出租方式 区 卧室数量 ... 时间 楼层 装修情况 距离 Label
0 0 118.0 NaN 11.0 1 ... 1 2 NaN 76.416667 5.602716
1 1 100.0 NaN 10.0 1 ... 1 1 NaN 70.916667 16.977929
2 2 130.0 NaN 12.0 2 ... 1 0 NaN 57.250000 8.998302
3 3 90.0 NaN 7.0 3 ... 1 2 NaN 65.833333 5.602716
4 4 31.0 NaN 3.0 2 ... 1 0 NaN NaN 7.300509
我们不难发现 在这些数据里面存在一些'NaN' 在这里面意思是空值 意思就是说丢失了 如果我们要对数据进行训练的话 那么就得先对他们进行处理 这也是数据预处理的基本处理
第三步:分类object类型
观察上列数据 我们可以发现 有些数据如房屋朝向它的表示不会是以int型,我们都知道计算机只认识数字 他可不认识什么中国汉字 所以我们在这里首先要做的是先把字符串类型和数值类型的特征进行分离
number_columns = [col for col in data.columns if data[col].dtype!='object']
category_columns = [col for col in data.columns if data[col].dtype =='object']
第四步:对object型进行转换
在这里我用的是LabelEncoder()方法 很简单 只需要几行代码
from sklearn.preprocessing import LabelEncoder #导入数据处理所必须的库
le = LabelEncoder()
for col in category_columns:
data[col] = le.fit_transform(data[col])
是不是很简单 只需要这么几句就可以了 但要想提高成绩光靠这几行是没啥用的QAQ
第五步:数据填充
数据预处理最最最关键的一步来了,那就是把空缺的数值都给我填上!这里我话不多说直接上代码
for item in data.columns:
if type(item) == str:
if data[item].isnull().sum()>0:
data[item].fillna('None',inplace=True)
else:
if data[item].isnull().sum()>0:
data[item].fillna(data[item].median(),inplace=True)
print(data.head())
填补前: ID 位置 出租方式 区 卧室数量 ... 时间 楼层 装修情况 距离 Label
0 0 118.0 NaN 11.0 1 ... 1 2 NaN 76.416667 5.602716
1 1 100.0 NaN 10.0 1 ... 1 1 NaN 70.916667 16.977929
2 2 130.0 NaN 12.0 2 ... 1 0 NaN 57.250000 8.998302
3 3 90.0 NaN 7.0 3 ... 1 2 NaN 65.833333 5.602716
4 4 31.0 NaN 3.0 2 ... 1 0 NaN NaN 7.300509
填补后: ID 位置 出租方式 区 卧室数量 ... 时间 楼层 装修情况 距离 Label
0 0 118.0 None 11.0 1 ... 1 2 None 76.416667 5.602716
1 1 100.0 None 10.0 1 ... 1 1 None 70.916667 16.977929
2 2 130.0 None 12.0 2 ... 1 0 None 57.25 8.998302
3 3 90.0 None 7.0 3 ... 1 2 None 65.833333 5.602716
4 4 31.0 None 3.0 2 ... 1 0 None None 7.300509
是不是发现了变化,这里我用了for循环遍历每一个特征,逐个进行处理
第六步:划分数据集
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
这里test_size 我更偏向于用0.3
主要参数说明:
train_data:待划分的样本集
train_target:待划分的样本集的标签集
test_size:样本占比,test数据集的占比 如果是整数,就是样本集的数量
random_state:是随机数的种子
第七步:特征缩放
在一个数据集中 经常会出现特征与特征之间 数值差异很大 这样很不利于计算机进行训练 所以我们需要对特征进行一定的缩放
from sklearn.preprocessing import StandardScaler
data_s = StandardScaler()
data = data_s.fit_transform(data)
这里的StandardScaler是去均值和方差归一化,防止两个特征列中特征值的范围差距过大,从而导致的收敛速率变慢。
该文章部分内容摘自Avik Jain的机器学习
志趣相通的朋友可以加个vx一起交流