百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

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

ztj100 2024-12-12 16:14 12 浏览 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为机器学习提供了强大的工具,使您能够更轻松地应对各种挑战,并取得更好的结果

相关推荐

使用Python编写Ping监测程序(python 测验)

Ping是一种常用的网络诊断工具,它可以测试两台计算机之间的连通性;如果您需要监测某个IP地址的连通情况,可以使用Python编写一个Ping监测程序;本文将介绍如何使用Python编写Ping监测程...

批量ping!有了这个小工具,python再也香不了一点

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友。在咱们网工的日常工作中,经常需要检测多个IP地址的连通性。不知道你是否也有这样的经历:对着电脑屏...

python之ping主机(python获取ping结果)

#coding=utf-8frompythonpingimportpingforiinrange(100,255):ip='192.168.1.'+...

网站安全提速秘籍!Nginx配置HTTPS+反向代理实战指南

太好了,你直接问到重点场景了:Nginx+HTTPS+反向代理,这个组合是现代Web架构中最常见的一种部署方式。咱们就从理论原理→实操配置→常见问题排查→高级玩法一层层剖开说,...

Vue开发中使用iframe(vue 使用iframe)

内容:iframe全屏显示...

Vue3项目实践-第五篇(改造登录页-Axios模拟请求数据)

本文将介绍以下内容:项目中的public目录和访问静态资源文件的方法使用json文件代替http模拟请求使用Axios直接访问json文件改造登录页,配合Axios进行登录请求,并...

Vue基础四——Vue-router配置子路由

我们上节课初步了解Vue-router的初步知识,也学会了基本的跳转,那我们这节课学习一下子菜单的路由方式,也叫子路由。子路由的情况一般用在一个页面有他的基础模版,然后它下面的页面都隶属于这个模版,只...

Vue3.0权限管理实现流程【实践】(vue权限管理系统教程)

作者:lxcan转发链接:https://segmentfault.com/a/1190000022431839一、整体思路...

swiper在vue中正确的使用方法(vue中如何使用swiper)

swiper是网页中非常强大的一款轮播插件,说是轮播插件都不恰当,因为它能做的事情太多了,swiper在vue下也是能用的,需要依赖专门的vue-swiper插件,因为vue是没有操作dom的逻辑的,...

Vue怎么实现权限管理?控制到按钮级别的权限怎么做?

在Vue项目中实现权限管理,尤其是控制到按钮级别的权限控制,通常包括以下几个方面:一、权限管理的层级划分...

【Vue3】保姆级毫无废话的进阶到实战教程 - 01

作为一个React、Vue双修选手,在Vue3逐渐稳定下来之后,是时候摸摸Vue3了。Vue3的变化不可谓不大,所以,本系列主要通过对Vue3中的一些BigChanges做...

Vue3开发极简入门(13):编程式导航路由

前面几节文章,写的都是配置路由。但是在实际项目中,下面这种路由导航的写法才是最常用的:比如登录页面,服务端校验成功后,跳转至系统功能页面;通过浏览器输入URL直接进入系统功能页面后,读取本地存储的To...

vue路由同页面重定向(vue路由重定向到外部url)

在Vue中,可以使用路由的重定向功能来实现同页面的重定向。首先,在路由配置文件(通常是`router/index.js`)中,定义一个新的路由,用于重定向到同一个页面。例如,我们可以定义一个名为`Re...

那个 Vue 的路由,路由是干什么用的?

在Vue里,路由就像“页面导航的指挥官”,专门负责管理页面(组件)的切换和显示逻辑。简单来说,它能让单页应用(SPA)像多页应用一样实现“不同URL对应不同页面”的效果,但整个过程不会刷新网页。一、路...

Vue3项目投屏功能开发!(vue投票功能)

最近接了个大屏项目,产品想在不同的显示器上展示大屏项目不同的页面,做出来的效果图大概长这样...

取消回复欢迎 发表评论: