机器学习-数据预处理

#---------导入数据集-------------------------------------------------------
import pandas as pd
from sklearn import datasets                     #获取sklearn数据集

iris = datasets.load_iris()                       #导入鸢尾花数据集
data = iris.data                                  #获得其特征向量(属性集)
target = iris.target                              #获取样本标签(结果标签)
feature_name = iris.feature_names                 #获取各个特征的名字
target_names = iris.target_names                  #获取标签的名字

# 鸢尾花数据
data1 = pd.DataFrame(data,columns=feature_name) 
print(data1.head(2))

# 泰坦尼克数据
data2 = pd.read_csv('Narrativedata.csv',index_col=[0])
data2.dropna(inplace=True)
print(data2.head(2))
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
    Age     Sex Embarked Survived
0  22.0    male        S       No
1  38.0  female        C      Yes

归一化

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
# fit,在这里本质是生成min(x)和max(x)
scaler = scaler.fit(data1)
result = scaler.transform(data1)
result[:5]
array([[0.22222222, 0.625     , 0.06779661, 0.04166667],
       [0.16666667, 0.41666667, 0.06779661, 0.04166667],
       [0.11111111, 0.5       , 0.05084746, 0.04166667],
       [0.08333333, 0.45833333, 0.08474576, 0.04166667],
       [0.19444444, 0.66666667, 0.06779661, 0.04166667]])
# 训练和导出结果一步达成
result_ = scaler.fit_transform(data)
result_[:5]
array([[0.22222222, 0.625     , 0.06779661, 0.04166667],
       [0.16666667, 0.41666667, 0.06779661, 0.04166667],
       [0.11111111, 0.5       , 0.05084746, 0.04166667],
       [0.08333333, 0.45833333, 0.08474576, 0.04166667],
       [0.19444444, 0.66666667, 0.06779661, 0.04166667]])
# 将归一化后的结果逆转
scaler.inverse_transform(result)[:5]
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2]])
# 使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
scaler = MinMaxScaler(feature_range=[5,10])         
result = scaler.fit_transform(data1)
result[:5]
array([[6.11111111, 8.125     , 5.33898305, 5.20833333],
       [5.83333333, 7.08333333, 5.33898305, 5.20833333],
       [5.55555556, 7.5       , 5.25423729, 5.20833333],
       [5.41666667, 7.29166667, 5.42372881, 5.20833333],
       [5.97222222, 8.33333333, 5.33898305, 5.20833333]])
# 当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了,此时使用partial_fit作为训练接口
scaler = scaler.partial_fit(data1)
scaler.transform(data1)[:5]
array([[6.11111111, 8.125     , 5.33898305, 5.20833333],
       [5.83333333, 7.08333333, 5.33898305, 5.20833333],
       [5.55555556, 7.5       , 5.25423729, 5.20833333],
       [5.41666667, 7.29166667, 5.42372881, 5.20833333],
       [5.97222222, 8.33333333, 5.33898305, 5.20833333]])

标准化

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()                           
scaler.fit(data1)                                   
x_std = scaler.transform(data1)                     
# 查看均值的属性mean_
scaler.mean_
array([5.84333333, 3.05733333, 3.758     , 1.19933333])
# 查看方差的属性var_
scaler.var_ 
array([0.68112222, 0.18871289, 3.09550267, 0.57713289])
# 查看标准化后的特征均值和方差
print('mean: ',x_std.mean())
print('std: ',x_std.std())
mean:  -1.4684549872375404e-15
std:  1.0
# 标准化结果输出
scaler.fit_transform(data1)[:5]
array([[-0.90068117,  1.01900435, -1.34022653, -1.3154443 ],
       [-1.14301691, -0.13197948, -1.34022653, -1.3154443 ],
       [-1.38535265,  0.32841405, -1.39706395, -1.3154443 ],
       [-1.50652052,  0.09821729, -1.2833891 , -1.3154443 ],
       [-1.02184904,  1.24920112, -1.34022653, -1.3154443 ]])
# 还原标准化前的结果
scaler.inverse_transform(x_std)[:5]
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2]])

标准化和归一化的选择

在这里插入图片描述

sklearn中的其他库

在这里插入图片描述

特征编码

离散型数据-针对标签label

from sklearn.preprocessing import LabelEncoder
 
# 要输入的是标签,不是特征矩阵,所以允许一维
y = data2.iloc[:,-1]                         
 
le = LabelEncoder()                        
le = le.fit(y)                              
label = le.transform(y) 
label[:3]
array([0, 2, 2])
# 也可以直接fit_transform一步到位
label = le.fit_transform(y)
label[:3]
array([0, 2, 2])
# 属性.classes_查看标签中究竟有多少类别
le.classes_
array(['No', 'Unknown', 'Yes'], dtype=object)
# 使用inverse_transform可以逆转 
le.inverse_transform(label)[:3]
array(['No', 'Yes', 'Yes'], dtype=object)
# 修改源数据
data2.iloc[:,-1] = label
data2.head(3) 
AgeSexEmbarkedSurvived
022.0maleS0
138.0femaleC2
226.0femaleS2

离散型数据-针对特征

from sklearn.preprocessing import OrdinalEncoder 

data_ = data2.copy() 
data_.head(3)
AgeSexEmbarkedSurvived
022.0maleS0
138.0femaleC2
226.0femaleS2
# 接口categories_对应LabelEncoder的接口classes_,一模一样的功能
model = OrdinalEncoder().fit(data_.iloc[:,1:-1])
model.categories_
[array([0., 1.]), array([0., 1., 2.])]
# 修改源数据
data_.iloc[:,1:-1] = model.fit_transform(data_.iloc[:,1:-1])
data_.head(3)
AgeSexEmbarkedSurvived
022.01.02.00
138.00.00.02
226.00.02.02

独热编码,创建哑变量

data2.head(3)
AgeSexEmbarkedSurvived
022.0maleS0
138.0femaleC2
226.0femaleS2
from sklearn.preprocessing import OneHotEncoder

X = data2.iloc[:,1:-1]
model = OneHotEncoder(categories='auto').fit(X)
result = model.transform(X).toarray()
result[:3]
array([[0., 1., 0., 0., 1.],
       [1., 0., 1., 0., 0.],
       [1., 0., 0., 0., 1.]])
# 依然可以直接一步到位,但为了给大家展示模型属性,所以还是写成了三步
OneHotEncoder(categories='auto').fit_transform(X).toarray()[:3]
array([[0., 1., 0., 0., 1.],
       [1., 0., 1., 0., 0.],
       [1., 0., 0., 0., 1.]])
# 依然可以还原
pd.DataFrame(enc.inverse_transform(result))
model.get_feature_names()
result[:3]
array([[0., 1., 0., 0., 1.],
       [1., 0., 1., 0., 0.],
       [1., 0., 0., 0., 1.]])
result.shape
(712, 5)
# axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data2,pd.DataFrame(result)],axis=1)
newdata.head(3)
AgeSexEmbarkedSurvived01234
022.0maleSNo0.01.00.00.01.0
138.0femaleCYes1.00.01.00.00.0
226.0femaleSYes1.00.00.00.01.0
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head(3)
AgeSurvivedFemaleMaleEmbarked_CEmbarked_QEmbarked_S
022.0No0.01.00.00.01.0
138.0Yes1.00.01.00.00.0
226.0Yes1.00.00.00.01.0

连续型数据-二分

# 将年龄二值化
data_2 = data2.copy()
from sklearn.preprocessing import Binarizer

# 类为特征专用,所以不能使用一维数组,要加上reshape(-1,1) 
X = data_2.iloc[:,0].values.reshape(-1,1)  
# threshold=30表示按30为界划分
transformer = Binarizer(threshold=30).fit_transform(X)
transformer[:3]
array([[0.],
       [1.],
       [0.]])

连续型数据-分箱

在这里插入图片描述

from sklearn.preprocessing import KBinsDiscretizer

X = data2.iloc[:,0].values.reshape(-1,1) 
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
#查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()[:3]
array([[1., 0., 0.],
       [0., 1., 0.],
       [1., 0., 0.]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值