通常,在我们的所处理的数据分布中有异常值是很常见的,并且许多算法都可以处理离群值,而ellipticalenvelope就是sklearn中直接内置的一个例子。该算法的优势在于,它在检测正态分布(高斯)特征中的异常点时表现得非常好:
我们在做数据挖掘,做特征工程时,选择对预测最有帮助的特征是防止过拟合和降低模型复杂性的必要步骤。Sklearn提供的最健壮的算法之一是递归特征消除(RFE)。它通过使用交叉验证自动找到最重要的特性,并丢弃其余的。
这个评估器的一个优点是它是一个包装器——它可以用于返回特征重要性或系数分数的任何Sklearn算法。下面是一个关于合成数据集的例子:
我们都知道,尽管随机森林非常强大,但过度拟合的风险非常高。因此,Sklearn提供了称为ExtraTrees(分类器和回归器)的RF替代方案。
"Extra"这个词并不是指更多的树,而是指更多的随机性。该算法使用了另一种类似于决策树的树。唯一的区别是,不同于在构建每棵树时计算分割阈值,这些阈值是为每个特征随机绘制的,并选择最佳阈值作为分割规则。这允许以偏差略微增加的代价来降低方差:
如果你正在寻找比SimpleImputer更健壮、更先进的imputation技术,Sklearn再次为你提供了支持。impute子包包括两个基于模型的impute算法KNNImputer和IterativeImputer。
顾名思义,KNNImputer使用k-Nearest-Neighbors算法来寻找缺失值的最佳替代:
另一个更健壮的算法是IterativeImputer。它通过将每个特征的缺失值建模为其他特征的函数来寻找缺失值。这个过程是按循序渐进的循环方式完成的。在每一步中,选择一个具有缺失值的特征作为目标(y),其余的作为特征数组(X)。然后,使用回归函数预测y中的缺失值,并对每个特征继续这个过程,直到max_iter次数(IterativeImputer的一个参数)。
因此,会为一个缺失的值生成多个预测。这种方法的好处在于将每个缺失的值视为随机变量,并将其与内在的不确定性相结合
array([[6.95847623,2.,3.],[4.,2.6000004,6.],[10.,4.99999933,9.]])
结果表明,使用IterativeImputer缺失值填补算法的BayesianRidge和ExtraTree算法性能效果变现更加优秀。
虽然正常情况下,数据分布中存在异常值是非常常见的,但异常值的存在会严重破坏任何模型的预测。许多异常值检测算法会丢弃异常值并将其标记为缺失。虽然这有助于模型的学习,但它完全消除了异常值对分布的影响。
另一种算法是HuberRegressor回归算法。它不是完全去除它们,而是在拟合数据期间给予异常值更小的权重。它有超参数epsilon来控制样本的数量,这些样本应该被归类为异常值。参数越小,对异常值的鲁棒性越强。它的API与任何其他线性回归函数相同。下面,你可以看到它与贝叶斯岭回归器在一个有大量异常值的数据集上的比较:
可以看到,设置参数epsilon为1.351.5,1.75的huberregressionor算法设法捕获不受异常值影响的最佳拟合线。
Sklearn中可以使用plot_tree函数绘制单个决策树的结构。这个特性可能对刚开始学习基于树的模型和集成模型的初学者很方便,通过该方法,对决策树的决策过程可视化,对其决策过程和原理更加一目了然。
还有其他绘制树的方法,比如Graphviz。
尽管感知机是一个奇特的名字,但它是一个简单的线性二进制分类器。算法的定义特征是适合大规模学习,默认为:
它等价于SGDClassifier,loss='perceptron',eta0=1,learning_rate="constant",penalty=None,但略快:
0.91928
Sklearn中另一个基于模型的特征选择模型是SelectFromModel。它不像RFECV那样健壮,但由于它具有较低的计算成本,可以作为大规模数据集的一个很好的选择。它也是一个包装器模型,适用于任何具有.feature_importance_或.coef_属性的模型:
(10000,8)
如结果所示,算法成功地删除了所有40个冗余特征。
总所周知,混淆矩阵是用于评估分类问题的常用方法。大多数我们通常使用的指标,如精度、召回率、F1、ROCAUC等等,都源于它。Sklearn中可以计算和绘制一个默认的混淆矩阵:
老实说,我不喜欢默认的混淆矩阵。它的格式是固定的—行是truelabels,列是predictionslabel。第一行和第一列是负类,第二行和第二列是正类。有些人可能更喜欢不同格式的矩阵,可能是转置或翻转的。
例如,我喜欢将正类作为第一行和第一列。这有助于我更好地隔离4矩阵项--TP,FP,TN,FN。幸运的是,你可以用另一个函数ConfusionMatrixDisplay绘制自定义矩阵:
在传递给ConfusionMatrixDisplay之前,可以把混淆矩阵cm放在任何格式中。
一般情况下,如果有可用于其他类型分布的替代方案,则将目标(y)转换为正态分布是没有意义的。
例如,Sklearn为目标变量提供了3种广义线性模型,分别是泊松、Tweedie或Gamma分布,而不是所期望的正态分布,poissonregressionor,TweedieRegressor和GammaRegressor可以生成具有各自分布的目标的稳健结果。
除此之外,他们的api与任何其他Sklearn模型一样。可以将它们的概率密度函数绘制在同一坐标系上,以确定目标的分布是否与这三个分布相匹配。
例如,要查看目标是否遵循泊松分布,可以使用Seaborn的kdeploy绘制它的PDF,并在相同的轴上使用np.random_poisson从Numpy中采样,绘制完美的泊松分布。
通常来说,基于树形模型和集合模型生成的结果更加稳健,同时在检测异常点方面也被证实是有效的。Sklearn中的IsolationForest使用一个极端随机树(tree.ExtraTreeRegressor)来检测异常值。每个样本被分裂到树的不同分支上,每个分支根据选定的单一特征,在该特征的最大和最小值之间随机选择一个分裂值。
这种随机分区会在每棵树的根节点和终止节点之间产生明显更短的路径。
因此,当随机树组成的森林为特定样本共同产生更短的路径长度时,它们极有可能是异常——Sklearn用户指南。
array([1,1,-1])
许多线性模型需要在数值特征上进行一些转换才能使其服从正态分布。StandardScaler和MinMaxScaler在大多数发行版中都比较适用。然而,当数据存在高偏度时,分布的核心指标,如平均值、中位数、最小值和最大值,就会受到影响。因此,简单的标准化和标准化对倾斜分布不起作用。
相反,Sklearn实现中提供了一个名为PowerTransformer的方法,它使用对数变换将任何倾斜的特征尽可能地转化为正态分布。考虑Diamonds数据集中的两个特征:
两者都严重倾斜。我们用对数变换PowerTransformer来解决这个问题:
Sklearn中的另一个数字转换器是RobustScaler,我们可以从它的名称猜出它的用途——可以以一种健壮到异常值的方式转换特性。如果一个特征中存在异常值,就很难使其服从正态分布,因为它们会严重扭曲均值和标准差。
与使用均值/标准不同,RobustScaler使用中值和IQR(四分位数范围)来衡量数据,因为这两个指标都不会因为异常值而有偏差。
在Sklearn中,有一个用make_pipeline函数创建Pipeline实例的简写。该函数不需要为Pipeline中的每一步命名,而是只接受变形器和估计器并执行它的工作,从而不需要使代码那么长:
上文中,我们使用select_dtypes函数和pandasDataFrames的columns属性来拆分数值列和分类列。虽然这当然有效,但使用Sklearn有一个更灵活、更优雅的解决方案。
make_column_selector函数创建一个可以直接传递到ColumnTransformer实例中的列选择器。它的工作原理与select_dtypes类似,甚至更好。它有dtype_include和dtype_exclude参数,可以根据数据类型选择列。如果需要自定义列筛选器,可以将正则表达式传递给pattern,同时将其他参数设置为None。下面是它的工作原理:
在我们刚学习机器学习时,常见的一个错误是使用LabelEncoder来编码有序的分类特征。注意到,LabelEncoder一次只允许转换一个列,而不是像OneHotEncoder那样同时转换。你可能会认为Sklearn犯了一个错误!
实际上,LabelEncoder应该只用于按照LabelEncoder文档中指定的方式对响应变量(y)进行编码。要编码特征数组(X),应该使用OrdinalEncoder,它将有序分类列转换为具有(0,n_categories-1)类的特性。它在一行代码中跨所有指定列执行此操作,使得在管道中包含它成为可能。
array([[0.,0.],[0.,2.],[2.,2.],[1.,1.]])
Sklearn内置了50多个指标,它们的文本名称可以在Sklearn.metrics.scores.keys中看到。在单个项目中,如果单独使用它们,则可能需要使用多个指标并导入它们。
从sklearn.metrics中导入大量指标可能会污染你的名称空间,使其变得不必要的长。一种解决方案是可以使用metrics.get_scorer函数使用其文本名称访问任何度量,而不需要导入它:
快多少呢?在我做过的实验中,HalvingGridSearch比普通GridSearch快11倍,HalvingRandomSearch甚至比HalvingGridSearch快10倍。
Sklearn在sklearn.utils中有一整套实用程序和辅助功能。Sklearn本身使用这个模块中的函数来构建我们使用的所有变形器transformers和估计器transformers。
这里有许多有用的方法,如class_weight.compute_class_weight、estimator_html_repr、shuffle、check_X_y等。你可以在自己的工作流程中使用它们,使你的代码更像Sklearn,或者在创建适合SklearnAPI的自定义转换器和评估器时,它们可能会派上用场。
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!