• sklearn机器学习——day03


    数据预处理

    做什么:从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程

    目的:让数据适应模型,匹配模型的需求

    特征工程

    做什么:将原始数据转换为更能代表预测模型的潜在问题的特征的过程

    目的:1) 降低计算成本,2) 提升模型上限

    数据挖掘五大流程

    1. 获取数据

    2. 数据预处理

    3. 特征工程

    4. 建模,测试模型并预测出结果

    5. 上线,验证模型效果

    sklearn中的数据预处理和特征工程

    模块preprocessing:几乎包含数据预处理的所有内容

    模块Impute:填补缺失值专用

    模块feature_selection:包含特征选择的各种方法的实践 

    模块decomposition:包含降维算法

    数据预处理的四种方法

    数据无量纲化

    缺失值

    处理分类型特征:编码与哑变量

    处理连续性特征:二值化与分段

    数据无量纲化:数据归一化

    将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。

    比如:将数据转化成0~10之间;

              梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;

              在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模 型精度,避免某一个取值范围特别大的特征对距离计算造成影响。

              但是决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。

    无量纲化:线性:中心处理:让所有记录减去一个固定值,即让数据样本数据平移到 某个位置

                                 缩放处理:通过除以一个固定值,将数据固定在某个范围之中,取对数也算是                                                    一种缩放处理

                     非线性

    数据归一化(preprocessing.MinMaxScaler):当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到 [0,1]之间,归一化之后的数据服从正态分布(注:归一化不是正则化)

                   公式:       

    代码实现公式:

    1. from sklearn.preprocessing import MinMaxScaler
    2. data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    3. #不太熟悉numpy的小伙伴,能够判断data的结构吗?
    4. #如果换成表是什么样子?
    5. import pandas as pd
    6. pd.DataFrame(data)
    7. #实现归一化
    8. scaler = MinMaxScaler() #实例化
    9. scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
    10. result = scaler.transform(data) #通过接口导出结果
    11. result
    12. result_ = scaler.fit_transform(data) #训练和导出结果一步达成
    13. scaler.inverse_transform(result) #将归一化后的结果逆转
    14. #使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
    15. data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    16. scaler = MinMaxScaler(feature_range=[5,10]) #依然实例化
    17. result = scaler.fit_transform(data) #fit_transform一步导出结果
    18. result
    19. #当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
    20. #此时使用partial_fit作为训练接口
    21. #scaler = scaler.partial_fit(data)

    BONUS: 使用numpy来实现归一化

    1. import numpy as np
    2. X = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
    3. #归一化
    4. X_nor = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    5. X_nor
    6. #逆转归一化
    7. X_returned = X_nor * (X.max(axis=0) - X.min(axis=0)) + X.min(axis=0)
    8. X_returned

    数据无量纲化:数据标准化

    当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分 布)

    公式:                 

    代码实现:

    1. from sklearn.preprocessing import StandardScaler
    2. data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    3. scaler = StandardScaler() #实例化
    4. scaler.fit(data) #fit,本质是生成均值和方差
    5. scaler.mean_ #查看均值的属性mean_
    6. scaler.var_ #查看方差的属性var_
    7. x_std = scaler.transform(data) #通过接口导出结果
    8. x_std.mean() #导出的结果是一个数组,用mean()查看均值
    9. x_std.std() #用std()查看方差
    10. scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
    11. scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化


    sklearn中各种缩放处理 

    数据预处理:缺失值  

    类是专门用来填补缺失值的。它包括四个重要参数:

     代码实现缺失值填补

    1. data.info()
    2. #填补年龄
    3. Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
    4. Age[:20]
    5. from sklearn.impute import SimpleImputer
    6. imp_mean = SimpleImputer() #实例化,默认均值填补
    7. imp_median = SimpleImputer(strategy="median") #用中位数填补
    8. imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
    9. imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成调取结果
    10. imp_median = imp_median.fit_transform(Age)
    11. imp_0 = imp_0.fit_transform(Age)
    12. imp_mean[:20]
    13. imp_median[:20]
    14. imp_0[:20]
    15. #在这里我们使用中位数填补Age
    16. data.loc[:,"Age"] = imp_median
    17. data.info()
    18. #使用众数填补Embarked
    19. Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
    20. imp_mode = SimpleImputer(strategy = "most_frequent")
    21. data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
    22. data.info()

    BONUS:用Pandas和Numpy进行填补其实更加简单

    1. import pandas as pd
    2. data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3
    3. Preprocessing\Narrativedata.csv",index_col=0)
    4. data.head()
    5. data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
    6. #.fillna 在DataFrame里面直接进行填补
    7. data.dropna(axis=0,inplace=True)
    8. #.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
    9. #参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False

    处理分类型数据:编码与哑变量

    为了让数据适 应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型

    preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值

    1. from sklearn.preprocessing import LabelEncoder
    2. y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维
    3. le = LabelEncoder() #实例化
    4. le = le.fit(y) #导入数据
    5. label = le.transform(y) #transform接口调取结果
    6. le.classes_ #属性.classes_查看标签中究竟有多少类别
    7. label #查看获取的结果label
    8. le.fit_transform(y) #也可以直接fit_transform一步到位
    9. le.inverse_transform(label) #使用inverse_transform可以逆转
    10. data.iloc[:,-1] = label #让标签等于我们运行出来的结果
    11. data.head()
    12. #如果不需要教学展示的话我会这么写:
    13. from sklearn.preprocessing import LabelEncoder
    14. data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

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

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

     处理连续型数据:二值化和分箱

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

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

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

    1. from sklearn.preprocessing import KBinsDiscretizer
    2. X = data.iloc[:,0].values.reshape(-1,1)
    3. est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
    4. est.fit_transform(X)
    5. #查看转换后分的箱:变成了一列中的三箱
    6. set(est.fit_transform(X).ravel())
    7. est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
    8. #查看转换后分的箱:变成了哑变量
    9. est.fit_transform(X).toarray()

    特征选择1:过滤法:方差过滤 

    特征工程第一步:理解业务

    Filter过滤法:法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关 性的各项指标来选择特征。以无 论接下来的特征工程要做什么,都要优先消除方差为0的特征

    方差过滤:是通过特征本身的方差来筛选特征的类

    1. from sklearn.feature_selection import VarianceThreshold
    2. selector = VarianceThreshold() #实例化,不填参数默认方差为0
    3. X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵
    4. #也可以直接写成 X = VairanceThreshold().fit_transform(X)
    5. X_var0.shape

    特征选择3:过滤法:卡方过滤

    卡方过滤:专门针对离散型标签(即分类问题)的相关性过滤

    1. from sklearn.ensemble import RandomForestClassifier as RFC
    2. from sklearn.model_selection import cross_val_score
    3. from sklearn.feature_selection import SelectKBest
    4. from sklearn.feature_selection import chi2
    5. #假设在这里我一直我需要300个特征
    6. X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
    7. X_fschi.shape
    8. cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
    9. Ts

    如何设定k的取值?

    1. #======TIME WARNING: 5 mins】======#
    2. %matplotlib inline
    3. import matplotlib.pyplot as plt
    4. score = []
    5. for i in range(390,200,-10):
    6. X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)
    7. once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
    8. score.append(once)
    9. plt.plot(range(350,200,-10),score)
    10. plt.show()

    F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法

    1. from sklearn.feature_selection import f_classif
    2. F, pvalues_f = f_classif(X_fsvar,y)
    3. F
    4. pvalues_f
    5. k = F.shape[0] - (pvalues_f > 0.05).sum()
    6. #X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)
    7. #cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

    互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法

    1. from sklearn.feature_selection import mutual_info_classif as MIC
    2. result = MIC(X_fsvar,y)
    3. k = result.shape[0] - sum(result <= 0)
    4. #X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
    5. #cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

    特征选择6:嵌入法

    一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行

    使用嵌入法时,我们先使 用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征

     两个较为重要的参数

    1. from sklearn.feature_selection import SelectFromModel
    2. from sklearn.ensemble import RandomForestClassifier as RFC
    3. RFC_ = RFC(n_estimators =10,random_state=0)
    4. X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y)
    5. #在这里我只想取出来有限的特征。0.005这个阈值对于有780个特征的数据来说,是非常高的阈值,因为平均每个特征
    6. 只能够分到大约0.001的feature_importances_
    7. X_embedded.shape
    8. #模型的维度明显被降低了
    9. #同样的,我们也可以画学习曲线来找最佳阈值
    10. #======【TIME WARNING:10 mins】======#
    11. import numpy as np
    12. import matplotlib.pyplot as plt
    13. RFC_.fit(X,y).feature_importances_
    14. threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)
    15. score = []
    16. for i in threshold:
    17. X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)
    18. once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()
    19. score.append(once)
    20. plt.plot(threshold,score)
    21. plt.show()

     特征选择8:包装法

    包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择。包装法在初始特征集上训练评估器,并且通过 coef_属性或通过feature_importances_属性获得每个特征的重要性。然后,从当前的一组特征中修剪最不重要的 特征。在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征

    1. from sklearn.feature_selection import RFE
    2. RFC_ = RFC(n_estimators =10,random_state=0)
    3. selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y)
    4. selector.support_.sum()
    5. selector.ranking_
    6. X_wrapper = selector.transform(X)
    7. cross_val_score(RFC_,X_wrapper,y,cv=5).mean()

  • 相关阅读:
    【web前端期末大作业】html网上在线书城大学生静态网页 大学生html当当书城仿站 网上书城购物网页作业HTML
    软件设计模式系列之十二——外观模式
    【滤波跟踪】基于Huber函数和最大相关熵的抗差滤波算法实现GNSS导航定位粗差处理附matlab代码
    思维模型 巴纳姆效应
    LeetCode每日一题(1717. Maximum Score From Removing Substrings)
    leetcode每天5题-Day41(二叉树7-二叉搜索树)
    Elasticsearch: Pipeline
    C#解析JSON详解
    2、HTML——标题分组、居中、引用标签、水平线标签下划线标签、删除标签、<font>标签、图像标签
    EfficientNet 系列网络学习
  • 原文地址:https://blog.csdn.net/weixin_44267765/article/details/126738465