机器学习 ||《菜菜的sklearn机器学习》笔记——3 特征工程

1. 数据挖掘五大流程

1. 获得数据
2. 数据预处理
3. 特征工程:

将原始数据转换成更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征(常以降维算法实现)来实现。

4. 建模
5. 上线

2.数据预处理 Preprocessing & Impute

  • 可以是线性的,也可以是非线性的,线性包括中心化处理和缩放处理
  • 中心化的本质:是让所有记录减去一个固定值,即让数据平移到某个位置。
  • 缩放的本质:是通过除以一个固定值,将数据固定在某个范围之中,取对数也是一种缩放处理。
  • 数据按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这一过程就叫数据归一最小化,在sklearn中使用preporcessing.MinMaxScaler来实现这个功能

preprocessing.MinMaxScaler

  • (重要参数:feature_range 控制希望把数据压缩到的范围 默认[0,1])
from sklearn.preprocessing import MinMaxScaler

data=[[-1, 2], [-0.5, 6], [0, 10], [1,18]]
#实现归一化
scaler = MinMaxScaler()  #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x) max(x)
result = scaler.transform(data) #通过接口导出结果
result_ = scaler.fit_transform(data) #训练和导出结果一步达成
scaler.inverse_transform(result) #将归一后的结果逆转

#使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
data = [[-1, 2],[-0.5, 6],[0, 10],[1, 18]]
scaler = MinMaxScaler(feature_range=(5,10)) 
result = scaler.fit_transform(data)
#当x中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
#此时当使用partial_fit作为训练接口
#即 scaler = scaler.partial_fit(data)
result

(也可使用numpy实现归一化)

preprocessing.StandardScaler

数据标准化(StandardScaler): 数据按均值中心化后再按标准差缩放,数据会服从为均值为0,方差为1的正态分布。

from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
#--------------------------------------------------------------
scaler = StandardScaler() #实例化
scaler.fit(data) #fit的本质是生成均值和反差
#scaler.mean_ 查看均值的属性mean_
#scaler.var_  查看反差属性var_

x_std = scaler.transform(data)  #通过接口导出结果
#x_std.mean()  导出结果是数组,用mean()查看均值 std()查看方差
#x_std.std() 
#--------------------------↑_plan_1----------------------------
scaler.fit_transform(data)  
#使用fit_transform(data)一步达成结果
#--------------------------↑_plan_2----------------------------
scaler.inverse_transform(x_std) 
#使用inverse_transform逆转标准化

StandardScaler MinMaxScaler 选个?

  • 大多机器学习算法会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。
  • PCA、聚类、逻辑回归、支持向量机、神经网络中,StandarScaler往往是最好的选择。
  • 建议先试试StandardScaler,效果不好换MinMaxScaler.
  • 还有众多,可参考下表
    在这里插入图片描述

2.2 缺失值

impute.SimpleImpute 类(包含四个参数)
  1. missing_values


    告诉SimpleImpute,数据中的缺失值长什么样,默认空值np.nan

  2. strategy


    填补缺失值的策略,默认均值。
    “mean” 使用均值填补 (仅对数值型特征可用)

    “median” 用中值填补 (仅对数值型特征可用)

    “most_frequent” 用众数填补 (对数值型和字符型特征都可用)

    “constant” 表示请参考参数“fill_value”中的值 (对数值型和字符型特征都可用)

  3. fill_value


    当参数startegy为“constant”的时候可用,可输入字符串或数字表示要填充的值,常用0

  4. copy


    默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

import pandas as pd
data = pd.read_csv(r"C:\Users\Lin_Yu\Desktop\预处理数据\Narrativedata.csv",index_col=0)
#data.info() 可看出年龄需要填补
Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
#.values.reshape(-1,1)是一个NumPy函数,它会将一个一维数组(values)转换为一个二维数组,
#其中第二个维度的大小为 1。
#参数"-1"是用来告诉函数自动计算第一个维度的大小,以保证数组元素的数量不变。

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer()  #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy ="constant",fill_value = 0) #用0填补

imp_mean = imp_mean.fit_transform(Age) #fit_transform 一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)

data.loc[:,"Age"] = imp_median
#data.info()发现还有Embarker存在缺失,用众数填补
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
用pandas和 Numpy进行填补更简单
import pandas as pd
data = pd.read_csv(r"C:\Users\Lin_Yu\Desktop\预处理数据\Narrativedata.csv",index_col = 0)
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#运用.fillna直接进行填补
data.dropna(axis=0,inplace=True)
#axis=0删除所有有缺失值的行 axis=1 删除所有有缺失值的列

2.3 编码与哑变量 (将文字型数据转换为数值型)

from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1]  #要输入的是标签不是特征矩阵,故允许一维
le = LabelEncoder()  #实例化
le = le.fit(y)       #导入数据
label = le.transform(y)
# le.classes_ 查看获得的结果
# label 查看获得的结果
## le.fit_transform(y) 也可以一步到位
#le.inverse_transform(label) 逆转回标签
data.iloc[:,-1] = label
data.head()

preprocessing.OrdinalEncoder:特征专用,能够将分类特征转化为分类数值

from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()

preprocessing.OneHotEncoder:独热编码,创建哑变量

from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]

enc = OneHotEncoder(categories = 'auto').fit(X) 
result = enc.transform(X).toarray()

#依旧可以还原
pd.DataFrame(enc.inverse_transform(result))

#enc.get_feature_names_out() 获取特征值名字

newdata = pd.concat([data,pd.DataFrame(result)],axis = 1)
newdata.drop(["Sex","Embarked"],axis = 1,inplace = True)
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head()

2.4 二值化与分段

sklearn.preprocessing.Binarizer

根据阈值将数据二值化,用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0.默认阈值为0时,特征中所有的正值都映射到1。

#将年龄二值化
data_2 = data.copy()
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1)  #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold = 30).fit_transform(X)

preprocessing.KBinsDiscretizer

将连续性变量划分为分类变量的类,能够将连续性变量排序后按顺序分箱后编码。总共包含三个主要参数:

  1. n_bins

    每个特征中分箱的个数,默认5 一次会被运用到所有导入的特征
  2. encode

    默认为"onehot"

    “onehot”:做哑变量,返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0

    “ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵

    “onehot-dense”:做哑变量,之后返回一个密集数组。
  3. strategy

    用来定义箱宽的方式,默认"quantile"

    “uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征max()-特征.min())/(n_bins)

    “quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同

    “kmeans”:表示按举类分箱,每个箱中的值到最近的一维K均值聚类的簇心得距离都相同
from sklearn.preprocessing import KBinsDiscretizer

X = data.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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值