百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

机器学习之道:揭秘Sklearn常用技巧(1)

toyiye 2024-07-06 00:17 20 浏览 0 评论

嘿,你知道吗?在这个世界上,有一种东西叫做LLMs,大型语言模型。它们是相当厉害的家伙,可以理解和生成各种各样的文本,甚至可以和人类一样聊上一会儿。但是,机器学习仍然是相当重要的,为什么呢?让我来告诉你。

想象一下,你有一堆数据,里面包含了世界上发生的各种各样的事情。现在,你想要从这堆数据中找到一些有用的模式或者做一些预测。这时候,机器学习就像是你的超级朋友,可以帮你轻松地做到这些事情。

而Sklearn,嘿,它简直就是机器学习世界的大杠把子。想象一下你在野外,突然受伤了,但是你有一根结实的棍子可以依靠。Sklearn就像是那根棍子,它支撑着你,让你能够在机器学习的旅程中穿越荆棘丛生的数据丛林。

所以,尽管LLMs可能会让你觉得人类的工作好像变得不那么重要了,但是机器学习和Sklearn仍然是你不可或缺的朋友。在这个世界上,我们需要的不仅仅是高级的技术,还需要那些能够帮助我们处理数据、做出预测并解决问题的工具。

想象一下,你正在走钢丝,下面是一片湍急的河流。你需要保持平衡,同时快速地朝前走。这就像是数据建模的过程,需要在不稳定的数据海洋中取得平衡,并快速做出决策。

但是,如果你掌握了一些Sklearn技巧,就像是你脚下多了一双坚固的钢丝鞋,可以让你更加稳健地前行。Sklearn的技巧就像是你的秘密武器,可以让你在建模的过程中更快地达到目标,更准确地预测结果。

在Sklearn的使用过程中,许多人往往过分专注于API文档,而忽略了许多常被忽视的技巧。或许大多数人停留在基础操作层面,然而实际上,Sklearn中隐藏着许多优雅的解决方案。让我们一起揭示这些宝贵的Sklearn技巧,让你在短时间内提升机器学习的能力。

1.检测离群值: covariance.EllipticEnvelope

分布中存在离群值是很常见的。许多算法都处理离群值,而EllipticalEnvelope是一个直接内置到Sklearn中的示例。该算法的优势在于,在正态分布(高斯分布)特征中,它在检测离群值方面表现异常出色。

import numpy as np
from sklearn.covariance import EllipticEnvelope


# Create a sample normal distribution
X = np.random.normal(loc=5, scale=2, size=50).reshape(-1, 1)


# Fit the estimator
ee = EllipticEnvelope(random_state=0)
_ = ee.fit(X)


# Test
test = np.array([6, 8, 20, 4, 5, 6, 10, 13]).reshape(-1, 1)


# predict returns 1 for an inlier and -1 for an outlier
ee.predict(test)

为了测试这个评估器(estimator),我们创建了一个均值为5,标准差为2的正态分布。在训练完成后,我们向其predict方法传递一些随机数。该方法对于测试中的离群值返回-1,这些离群值是20、10、13。

2.特征选择:feature_selection.RFECV

选择对预测最有帮助的特征是应对过拟合和降低模型复杂性的必要步骤。Sklearn 提供的最强大的算法之一是递归特征消除(Recursive Feature Elimination,RFE)。它通过交叉验证自动找到最重要的特征,并丢弃其余的特征。

这个评估器(estimator)的一个优势是它是一个包装器(wrapper) —— 它可以用于任何返回特征重要性或系数分数的 Sklearn 算法。以下是一个在模拟生成的数据集示例:

from sklearn.datasets import make_regression
from sklearn.feature_selection import RFECV
from sklearn.linear_model import Ridge


# Build a synthetic dataset
X, y = make_regression(n_samples=10000, n_features=15, n_informative=10)


# Init/fit the selector
rfecv = RFECV(estimator=Ridge(), cv=5)
_ = rfecv.fit(X, y)


# Transform the feature array
rfecv.transform(X).shape

这个模拟生成的数据集有15个特征,其中有10个是信息丰富的,其余的是冗余的。我们使用岭回归作为估计器进行5折RFECV拟合。训练完成后,您可以使用transform方法来丢弃冗余特征。调用.shape方法可以显示估计器成功丢弃了所有5个不必要的特征。

3.决策树的扩展集成学习方法: ensemble.ExtraTrees

尽管随机森林非常强大,但过拟合的风险也很高。因此,Sklearn提供了一个名为ExtraTrees(分类器和回归器均支持,classifier and regressor)的替代方案,可以直接替代随机森林。

“extra”一词并不意味着更多的树,而是更多的随机性。该算法使用另一种类型的树,它与决策树非常相似。唯一的区别在于,在构建每棵树时,该算法不是计算分裂阈值,而是为每个特征随机绘制这些阈值,并选择最佳阈值作为分裂规则。这降低了方差,但代价是略微增加了偏差。

from sklearn.ensemble import ExtraTreesRegressor, RandomForestRegressor
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor


X, y = make_regression(n_samples=10000, n_features=20)


# Decision trees
clf = DecisionTreeRegressor(max_depth=None, min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y, cv=5)
print("DecisionTreeRegressor cross_val_score:",scores.mean())




# Random Forest
clf = RandomForestRegressor(
    n_estimators=10, max_depth=None, min_samples_split=2, random_state=0
)
scores = cross_val_score(clf, X, y, cv=5)
print("RandomForestRegressor cross_val_score:",scores.mean())


# ExtraTrees
clf = ExtraTreesRegressor(
    n_estimators=10, max_depth=None, min_samples_split=2, random_state=0
)
scores = cross_val_score(clf, X, y, cv=5)
print("ExtraTreesRegressor cross_val_score:",scores.mean())

在一个合成数据集上,ExtraTreesRegressor的表现优于随机森林。

4.缺失值填充: impute.IterativeImputer和KNNImputer

比SimpleImputer更健壮、更高级的填补缺失值的技术,Sklearn提供了解决方案。klearn.impute子包包含两种基于模型的填补缺失值算法——KNNImputer和IterativeImputer。

KNNImputer使用k-最近邻算法来找到缺失值的最佳替代值:

from sklearn.impute import KNNImputer


# Code taken from Sklearn user guide
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]


imputer = KNNImputer(n_neighbors=2)
imputer.fit_transform(X)

IterativeImputer是更健壮的算法:它通过将具有缺失值的每个特征建模为其他特征的函数来找到缺失值。这个过程是以循环的方式逐步进行的。在每一步中,选择一个具有缺失值的特征作为目标(y),而其余的特征被选择为特征数组(X)。然后,使用回归器来预测y中的缺失值,并且这个过程对每个特征都会继续进行,直到达到max_iter次数(IterativeImputer的一个参数)。

因此,对于单个缺失值,会生成多个预测。这样做的好处是将每个缺失值视为随机变量,并与其相关的不确定性一并考虑在内:

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge


imp_mean = IterativeImputer(estimator=BayesianRidge())
imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])


X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]


imp_mean.transform(X)

5.离群值处理: linear_model.HuberRegressor

存在离群值会严重影响任何模型的预测结果。许多离群值检测算法会将离群值丢弃并标记为缺失值。虽然这有助于模型的学习功能,但却完全消除了离群值对分布的影响。

另一种替代算法是HuberRegressor。它不会完全移除离群值,而是在拟合期间给予离群值较小的权重。它具有一个epsilon超参数,用于控制应将多少样本分类为离群值。参数越小,模型对离群值的鲁棒性越强。它的API与任何其他线性回归器相同。

下面是sklearn 官方示例:HuberRegressor与Bayesian Ridge regressor在具有大量离群值的数据集上的比较:

# Authors: Manoj Kumar mks542@nyu.edu
# License: BSD 3 clause


import matplotlib.pyplot as plt
import numpy as np


from sklearn.datasets import make_regression
from sklearn.linear_model import HuberRegressor, Ridge


# Generate toy data.
rng = np.random.RandomState(0)
X, y = make_regression(
    n_samples=20, n_features=1, random_state=0, noise=4.0, bias=100.0
)


# Add four strong outliers to the dataset.
X_outliers = rng.normal(0, 0.5, size=(4, 1))
y_outliers = rng.normal(0, 2.0, size=4)
X_outliers[:2, :] += X.max() + X.mean() / 4.0
X_outliers[2:, :] += X.min() - X.mean() / 4.0
y_outliers[:2] += y.min() - y.mean() / 4.0
y_outliers[2:] += y.max() + y.mean() / 4.0
X = np.vstack((X, X_outliers))
y = np.concatenate((y, y_outliers))
plt.plot(X, y, "b.")


# Fit the huber regressor over a series of epsilon values.
colors = ["r-", "b-", "y-", "m-"]


x = np.linspace(X.min(), X.max(), 7)
epsilon_values = [1, 1.5, 1.75, 1.9]
for k, epsilon in enumerate(epsilon_values):
    huber = HuberRegressor(alpha=0.0, epsilon=epsilon)
    huber.fit(X, y)
    coef_ = huber.coef_ * x + huber.intercept_
    plt.plot(x, coef_, colors[k], label="huber loss, %s" % epsilon)


# Fit a ridge regressor to compare it to huber regressor.
ridge = Ridge(alpha=0.0, random_state=0)
ridge.fit(X, y)
coef_ridge = ridge.coef_
coef_ = ridge.coef_ * x + ridge.intercept_
plt.plot(x, coef_, "g-", label="ridge regression")


plt.title("Comparison of HuberRegressor vs Ridge")
plt.xlabel("X")
plt.ylabel("y")
plt.legend(loc=0)
plt.show()

HuberRegressor在epsilon值为1.35、1.5和1.75时,能够捕捉到最佳拟合直线,而且不受离群值的影响。

6.树结构的展现:tree.plot_tree

Sklearn使用plot_tree函数绘制单个决策树的结构。对于刚开始学习基于树和集成模型的初学者来说,这个功能可能会很方便。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree


iris = load_iris()
X, y = iris.data, iris.target
clf = DecisionTreeClassifier()
clf = clf.fit(X, y)


plt.figure(figsize=(15, 10), dpi=200)
plot_tree(clf, feature_names=iris.feature_names, 
               class_names=iris.target_names);

7.感知器:linear_model.Perceptron

感知器(Perceptron):尽管它有一个花哨的名字,但它实际上是一个简单的线性二元分类器。该算法的特点是适用于大规模学习,并且默认情况下:

  • 不需要学习率。
  • 不实现正则化。
  • 只在出现错误时更新模型。

它等同于SGDClassifier,其中loss='perceptron',eta=1,learning_rate="constant",penalty=None,但略快一些。

from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron


# Create a large dataset
X, y = make_classification(n_samples=100000, n_features=20, n_classes=2)


# Init/Fit/Score
clf = Perceptron()
_ = clf.fit(X, y)


clf.score(X, y)

8.基于模型的特征选择: feature_selection.SelectFromModel

Sklearn中的另一个基于模型的特征选择估计器是SelectFromModel。它虽然没有RFECV那么健壮,但对于大规模数据集来说可能是一个不错的选择,因为它的计算成本较低。它也是一个包装器估计器,适用于任何具有.feature_importances_或.coef_属性的模型。

from sklearn.feature_selection import SelectFromModel


# Make a dataset with 40 uninformative features
X, y = make_regression(n_samples=int(1e4), n_features=50, n_informative=10)


# Init the selector and transform feature array
selector = SelectFromModel(estimator=ExtraTreesRegressor()).fit(X, y)


selector.transform(X).shape

如上图:该算法成功地丢弃了所有40个多余的特征。

9.混淆矩阵的显示: metrics.ConfusionMatrixDisplay

混淆矩阵是分类问题中的圣杯。大多数指标都是从中导出的,如精确度、召回率、F1值、ROC AUC等。Sklearn允许您计算和绘制默认的混淆矩阵。

from sklearn.metrics import plot_confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.tree import ExtraTreeClassifier


# Make a binary classification problem
X, y = make_classification(n_samples=200, n_features=5, n_classes=2)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=1121218
)


clf = ExtraTreeClassifier().fit(X_train, y_train)


fig, ax = plt.subplots(figsize=(5, 4), dpi=100)
plot_confusion_matrix(clf, X_test, y_test, ax=ax)

10.广义线性模型: Generalized Linear Models

如果有其他可以处理不同类型分布的替代方法,那么将目标(y)转换为正态分布就没有意义。

例如,Sklearn提供了三种适用于目标变量为Poisson(泊松)、Tweedie或Gamma(伽玛)分布的广义线性模型。与期望正态分布不同,PoissonRegressor、TweedieRegressor和GammaRegressor可以为具有相应分布的目标生成稳健的结果。

除此之外,它们的API与任何其他Sklearn模型相同。要确定目标的分布是否与上述三种匹配,您可以将它们的概率密度函数(Probability Density Function)绘制在同一坐标轴上与完美分布。

例如,要查看目标是否遵循泊松分布,请使用Seaborn的kdeplot绘制其概率密度函数(Probability Density Function),并在同一坐标轴上使用Numpy的np.random.poisson从中抽样以绘制完美的泊松分布。

以上汇总了Sklearn机器学习中的关键方法和技巧,包括离群值检测、特征选择、集成学习、缺失值填充、离群值处理、决策树展现、感知器应用和模型选择。通过掌握这些技巧,您可以更好地处理数据、提高模型性能,并做出更准确的预测。Sklearn为机器学习提供了强大的工具,使您能够更轻松地应对各种挑战,并取得更好的结果

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码