labelbinarizer,labelbinarizer函数的作用

http://www.itjxue.com  2023-01-07 04:35  来源:未知  点击次数: 

标签二值化LabelBinarizer

来自 sklearn.preprocessing 的一个实用工具,将标签型数据转换为 0 或 1,对于二类以上的数据,转换为对应的 onehot 向量,具体看例子:

数据预处理与特征工程

概念:数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用模型的记录的过程

可能面对的问题:

数据预处理的目的:让数据使用模型,匹配模型的需求

数据的无量纲化是指将不同规格的数据转换到统一规格,或者讲不通分布的数据转换到某个特定分布的需求,这种需求统称为数据的无量纲化

将数据压缩到指定的范围,默认为[0,1],也可以通过参数 feature_range 把数据压缩到其他范围

通过方法 inverse_transform ,可以将归一化之后的结果逆转

通过参数 feature_range 把数据压缩到其他范围

通过标准化处理,将数据为标准正态分布

查看标准化之后的平均值和方差,看是否符合标准正态分布

因为 preprocessing.MinMaxScaler 对异常值非常敏感,所以在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中, StandardScaler 往往是最好的选择

MinMaxScaler 在不涉及距离度量,梯度,方差,协方差计算以及数据需要被压缩到特定区间时使用广泛。

综上,可以优先选择 StandardScaler 当效果不好时可以考虑选择 MinMaxScaler

运用 impute.SimpleImpute(missing_values=np.nan,strategy=,fill_value=,copy) 模块对缺失值进行填充处理

(1)读取修改之后的带有缺失数据的泰坦尼克号数据集

(2) 查看数据集的情况

(3)对 Age 分别用平均值,0,中位数进行缺失值填充

同理使用同样的方法对 Embarked 进行缺失值填充处理

我们也可以直接使用pandas对缺失数据进行填充

在实际生活中我们所收集到的特征信息,并不是以数字表示的,而是以文字表示的,比如收款方式,支付宝或者微信,学历,高中,大学,硕士,这些文字变量,机器学习是无法fit的,所以在建立模型之前要事先对这些变量进行处理,将文字转化为数字变量,这一过程称之为编码,而这些文字本质上代表类别,所以具有分类型数据的特征

同样的标签也可以做哑变量,使用的模块为 preprocessing.LabelBinarizer

根据阈值将数值二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0,默认阈值为0是,特征中所有的正值为1,负值为0,二值化是对文本计数数据的常见操作,可以决定仅考虑某种现象的存在与否,还可以用作考虑布尔随机变量的估计器的预处理步骤

这是将连续型变量划分为分类变量的类,能够将连续型变量排序之后按顺序分箱后编码

可见x具有相当多的特征,如果将所有的特征都导入矩阵,无疑会给矩阵的运行增加负担,所以我们要事先对齐进行筛选

过滤方法通常做数据的预处理步骤,特征选择完全独立于任何机器学习算法,它是根据各种统计检验中的分数以及相关性的各项指标来选取特征

通过特征本身的方差来筛选特征的类,比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能是特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区别就没有作用,所以要优先消除方差为0的特征

VarianceThreshold有重要参数threshold,表示方差的阈值,表示舍弃所有方差小于阈值的特征,默认为0,即删除所有记录都相同的特征

可以看到,方差过滤之后剩余的特征还有708个,比之前的784减少了72个,如果我们知道我们需要多少个特征,方差也可以直接帮助我们一次性筛选到位,比如我们希望留下一半的特征,那么我们就把阈值设定为中位数

可以看到使用中位数之后,特征值减少了一半

使用KNN和随机森林对方差过滤前后的模型分别进行建模分析,查看过滤前后的准确度

(1)导入模块并准备数据

(2)KNN方差过滤前

(3)KNN方差过滤后

可以看出,对于KNN过滤之后的效果十分明显,准确率稍有提升,单平均运行时间减少了10分钟,特征选择过后算法的效率上升了1/3

(4)随机森林方差过滤前

(5)随机森林方差过滤之后

可以看到方差过滤前后对随机森林预测的准确率影响不大,对运行时间的影响也不大

这是因为最近邻算法KNN,单棵决策树,支持向量机SVM,神经网络,归回算法,都需要对所有特征进行遍历或升维来进行运算,而随机森林本身就不需要遍历所有的随机变量,只需要选取固定数量的特征就可以进行建模分析,所以方差过滤对其影响不大,

过滤法的主要对象,就是需要遍历特征或升维的算法们,而过滤法的主要目的就是在维持算法表现的前提下,帮助算法们降低运算的成本

卡方过滤是专门针对离散型标签(分类问题)的相关过滤,卡方检验 feature_selection.chi2 计算每非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低的为特征排名,再结合 feature_selection.SelectKBest 这个可以输入“评分标准”来选出前K个分数最高的类,去除独立标签,即与我们分类目的无关的标签

卡方检验检测到某个特征中所有的值都相同,会提示我们进行方差过滤,同时卡方计算的是非负标签,所以我们可以优先对标签进行归一化处理

我们可以看到,模型的效果降低了,说明我们在设置k=300时删除了一些与模型相关且有效的特征,可以通过绘制超参数曲线来找到最佳k值

通过这条曲线,我们可以看到随着K值得不断增加,模型的表现不断上升,这说明K越大越好,即数据中的特征与标签均相关,

卡方检验的本质是推测两组数组之间的差异,其检验的原假设是“两组数据是相互独立的”,卡方检验返回卡防值和P值两个统计量,一般用p值作为有效性的范围界定,即当P值小于0.01或0.05时,我们认为两组数据是相关的,拒绝原假设

从特征工程角度,我们希望选取卡方值很大,p值小于0.05的特征

可以观察到,所有特征的p值都是0,说明对于digit recognizon这个数据集来说。方差验证已经把所有和标签无关的特征剔除掉了,在这种情况下,舍弃任何一个特征,都会舍弃对模型有用信息,从而使模型表现下降

F检验,又称齐方差检验,是用来捕捉每个特征和标签之间的线性关系的过滤方法,包含 feature_selection.f_classif F分类检验和 feature_selection.f_regression F回归检验

和卡方检验相同,这两个类需要和 SelectKBest 连用,F检验在数据服从正态分布的时候非常稳定,所以在使用F检验之前,我们可以先对数据进行标准正态化,然后再进行F检验

F检验的本质是寻找两组数据之间的线性关系,其原假设是“数据不存在显著的线性关系”。它返回F值和p值两个统计量。当p值小于0.01或0.05时我们认为两个变量之间存在线性关系,即我们要舍弃p值大于0.01或0.05的值

得到的结果和卡方过滤得到的结论保持一致,没有任何值得特征大于0.01,所有的特征都是和标签相关的,因此我们不需要相关性过滤

互信息是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法,包含 feature_selection.mutual_info_classif (互信息分类)和 feature_selection.mutual_info_regression (互信息回归)。互信息法返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0表示两个变量独立,为1表示两个变量完全相关

嵌入法是一种方算法自己决定使用那些特征的方法,即特征选择和算法训练同时进行,在使用嵌入法时,先使用某些机器学习的算法和模型进行训练,得到每个特征的权值系数,根据权值系数从大到小选择特征,这些权值系数代表特征对标签的重要性程度,比如决策树和树的集成模型中的 feature_importances_ 属性,可以列出各个特征对树的建立贡献,因此相对于过滤法,嵌入法的结果会更加精确到模型的效用本身,对于提高模型效力有更好的效果

但是嵌入法返回的是权值系数,我们无法和卡方检验和F检验,通过筛选P值的方式来进行筛选,我们并不知道权值系数处于一个什么样的范围是最好的,因此我们可以使用学习曲线的方式来选取最优权值参数

feature_selection.SelectFromModel(estimator,threshold=None)

SelectModel 是一个元变换器,可以与任何在拟合后具有 coef_ , feature_importances_ 属性或参数中可选惩罚项的评估器一起使用,比如随机森林和树模型就有属性 feature_importances_ ,逻辑回归就带有 l1 和 l2 惩罚项,线性支持向量机也支持 l2 惩罚项

可以看到特征数降为47,但是这样设定阈值是不准确的,我们可以通过绘制学习曲线来找到最优的阈值

从图像上来看,随着阈值越来越高,模型的效果越来越差,被删除的特征值越来越多,信息损失也越来越大,但是在0.00134之前,模型的效果都可以维持在0.93以上,因此我们可以继续选定一个范围,细化学习曲线来找到最佳值

从图像上可以看到阈值为0.000564时模型的效果是最好的,我们可以把0.000564带入模型看一下效果

可以看到模型的准确率升高为94%点多,因此,比起要考虑很多统计量的过滤法来说,前复发可能是更有效的一种方法,然而,在算法本身复杂的时候,过滤法的计算量远远比嵌入法快,所以在大型数据中,还是要优先考虑过滤法

包装法也是特征选择和算法同时进行的方法,与嵌入法相同的是包装法也是通过模型训练之后的 feature_importantances_ 或者 coef_ 来进行特征的选择,与嵌入法不同的是包装法不需要我们指定阈值,包装法通过 coef_ 属性或 feature_importantances_ 属性获得每个特征的重要性,然后从当前的一组特征中修剪最不重要的特征。在修剪的集合上地柜地重复该过程,直到最终到达所需数量的要选择的特征

包装法是最能保证模型效果的特征选择方法,但是包装法要使用特征子集进行多次训练,所以包装法需要的计算成本是最高的

feature_selection.RFE(estimator,n_features_to_select=None,step=1,verbose=0)

feature_selection.RFECV(estimator,n_features_to_select=None,step=1,verbose=0,cv=5)

参数 estimator 是需要填写的实例化后的评估器, n_features_to_select 是想要选择的特征个数, step 表示每次迭代中希望移除的特征个数。除此之外,RFE类有两个很重要的属性, support_ 返回所有的特征的是否最后被选中的布尔矩阵,以及 ranking_ 返回特征的按数次迭代中综合重要性的排名。类feature_selection.RFECV会在交叉验证循环中执行RFE以找到最佳数量的特征,增加参数cv,其他用法都和RFE一模一样。

使用超参数曲线寻找最优的特征保留数目

明显可以看出,在包装法下,应用50个特征时,模型的表现就已经达到了90%,比嵌入法和过滤法都高效很多,在特征数相同的情况下,包装法在效果上匹敌嵌入法,同样我们也可以进一步细化超参数曲线来找到最优的特征数。

python 里面LabelBinarizer的 用法

#?tag?input?labels?and?create?a?list?of?length?num_classes,?with?all?0's?except?the?correct?class,?which?is?1

import?numpy?as?np

from?sklearn.preprocessing?import?LabelBinarizer

def?binarize_labels(label_set):

????encoder?=?LabelBinarizer()

????encoder.fit(label_set)

????label_set?=?encoder.transform(label_set)

????label_set?=?label_set.astype(np.float32)

????return?label_set

以下是输入结果:

print(binarize_labels(["是",?"不",?"是"]))

print(binarize_labels(["A",?"B",?"C"]))

print(binarize_labels([1,?2,?3,4,255]))

可以把你的LIST变成二进制化的。

scikit-learn svm库使用小结

自己在hsi_svm3d.py中实现过scikit-learn svm库用于高光谱图像分类任务

参数小结1

C:C-SVC的惩罚参数C?默认值是1.0

C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’

0 – 线性:u'v

1 – 多项式:(gamma u' v + coef0)^degree

2 – RBF函数:exp(-gamma|u-v|^2)

3 –sigmoid:tanh(gamma u' v + coef0)

degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。

gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features

coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。

probability :是否采用概率估计?.默认为False

shrinking :是否采用shrinking heuristic方法,默认为true

tol :停止训练的误差值大小,默认为1e-3

cache_size :核函数cache缓存大小,默认为200

class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)

verbose :允许冗余输出?

max_iter :最大迭代次数。-1为无限制。

decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3

random_state :数据洗牌时的种子值,int值

主要调节的参数有:C、kernel、degree、gamma、coef0。

参数小结2

参数选择:

1、使用sklearn 中的gridsearchcv方法,通过列出参数空间,让程序自己去遍历每一种超参数组合,找到最优的一组。

在svm中使用过,确实不错,但其对于无法满足的超参数(比如Nusvm中的nu)没有解决方案,会直接崩。

参见笔记 网格追踪寻找最优超参数组合Parameter estimation using grid search with cross-validation

2、注意类别不平衡的情况下使用 class_weight='balanced'

使用技巧:

1、数据预处理和一些函数的详细说明在 API 参考手册

2、在样本维数m=2*样本个数n时,分类效果就不好了,

3、sklearn.preprocessing.LabelBinarizer

方法:fit_transform(y)

功能:Fit label binarizer and transform multi-class labels to binary labels.

它有一个逆向方法:inverse_transform(Y, threshold=None)

Transform binary labels back to multi-class labels

其实很多函数都有逆向方法。

参考:

1、 sklearn.svm.SVC 参数说明

2、 scikit-learn 支持向量机算法库使用小结

博客园-刘建平Pinard 3、 API 参考手册

(责任编辑:IT教学网)

更多

推荐CorelDraw教程文章