数据集的预处理

python进行机器学习的第一步——数据预处理
写文章的目的是为了巩固所学,和方便回顾查找。如有讲错的地方,欢迎指出,谢谢。

载入数据:(这里使用了泰坦尼克的数据集)

import pandas as pd
dataset = pd.read_csv('train.csv')
x = dataset.iloc[:,[2,4,5]].values  #采取了数据集中的舱等级,性别,年龄作为演示特征值
y = dataset.iloc[:,1].values  #存活为标记(因变量)
print(x)
print(y)

输出结果发现x存在部分值的缺失以及非数值型的值。(python中缺失值用nan标记)

#x的输出结果
[[3 'male' 22.0]
 [1 'female' 38.0]
 [3 'female' 26.0]
 ...
 [3 'female' nan]
 [1 'male' 26.0]
 [3 'male' 32.0]]

对缺失数值进行处理
① | 第一种方法是直接删除缺失值所在的样本。这个方法的缺陷是对于数据集比较小的,删除样本可能会对结果造成影响

② | 使用已有的方法进行处理。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN',strategy = 'mean',axis = 0)
x[:,[2]] = imputer.fit_transform(x[:,[2]])
print(x)

输出:

#可以看到age的缺失值被策略进行了填充
[[3 'male' 22.0]
 [1 'female' 38.0]
 [3 'female' 26.0]
 ...
 [3 'female' 29.69911764705882]
 [1 'male' 26.0]
 [3 'male' 32.0]]

关于Imputer参数:
1. missing_value –>标记哪些是缺失值,匹配作用位置
2. strategy –>处理的策略:mean 是取平均值 | median是取中位数 | most_frequent是取出现频率最高进行替换
3. :axis 是策略作用的范围,0表示在缺失那一列应用策略,然后取代,1则是在行应用策略


数据分类:
在进行机器学习的过程中实际是运用各种方程式对数据进行运算,而数据集中的 舱等级性别表示的是不同类别,需要进行虚拟编码转化成有意义的数值。
船舱等级有三等,1,2,3,性别只有male或者female

性别只有2个取值,可以使用LabelEncoder处理

#对性别一列进行虚拟编号,区分类别,转化
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
x[:,1] = labelencoder.fit_transform(x[:,1])
print(x)

输出:

[[3 1 22.0]
 [1 0 38.0]
 [3 0 26.0]
 ...
 [3 0 29.69911764705882]
 [1 1 26.0]
 [3 1 32.0]]

船舱等级有三个(两个以上),可以使用OneHotEncoder处理

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features=[0])
x = onehotencoder.fit_transform(x).toarray()
print(x)

输出:

[[ 0.          0.          1.          1.         22.        ]
 [ 1.          0.          0.          0.         38.        ]
 [ 0.          0.          1.          0.         26.        ]
 ...
 [ 0.          0.          1.          0.         29.69911765]
 [ 1.          0.          0.          1.         26.        ]
 [ 0.          0.          1.          1.         32.        ]]

特征缩放:
同是特征,特征的取值如果差别很大,不加处理直接训练可能会因此导致比较属性值较小的特征对训练结果做出的贡献被忽略,导致效果不好

很多算法都用到了欧式距离来描述数据间的关系
欧式距离
例如:一个人的年龄跟年薪之间,差别很大
A{‘age’ : 22,’Annual salary’ :200000} , B{‘age’ : 35,’Annual salary’ :600000}
所得的欧式距离很大,几乎可以忽略年龄这一特征做出的贡献,这是我们需要避免的,因此需要进行特征缩放,是他们在同一个数量级

from sklearn.preprocessing import StandardScaler
standardscaler = StandardScaler()
x = standardscaler.fit_transform(x)

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/82497380