在从事商业 AI 项目的这些年中,我遇到了采用机器学习算法的各种产品和业务领域。这种经验帮助我形成了一些最佳实践,用于为不同类型的业务任务选择正确的算法。在本文中,我将从我的经验中分享一些关于如何以最有效的方式与他们合作以满足客户业务需求的宝贵见解。
1.回归
回归是一种众所周知的 ML 算法,用于探索自变量或特征(预测变量)与因变量(目标)或输出之间的关系。回归通常用于根据历史数据解释或预测特定数值。
它在实践中如何运作?想象一下,您的客户是一位房地产企业主,他想根据价格和出售房屋的时间之间的最佳关系来设定他们出售的公寓和房屋的价格。您可以开发一个回归模型,该模型能够根据在这种情况下提供的各种特征来预测每个指定房屋/公寓的价格,以获得某种基准推荐价格。
要开发可靠的 AI 模型,您需要为其提供以下历史数据:
- 描述需要出售的房屋/公寓的各种特征:房间数、楼层数、卧室数等
- 地理特征:首都的房子比其他城市贵很多
- 人口、这个地方的时尚程度以及其他可能影响价格的信息
那么,让我们尝试建立一个回归模型。鉴于在现实生活中目标变量与所有其他特征之间很少存在线性相关性,让我们构建多项式回归来模拟特征与目标变量之间的非线性关系。通过创建多项式特征,我们可以创建一个更复杂的模型来捕捉这些非线性关系。
首先,让我们导入我们将用于训练多项式回归的所有必要模块和数据集:
- from sklearn.datasets import fetch_california_housing
- from sklearn.linear_model import LinearRegression
- from sklearn.preprocessing import PolynomialFeatures
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import mean_squared_error
-
- house_dataset = fetch_california_housing()
- X = house_dataset.data
- y = house_dataset.target
复制代码
我们将使用加州住房数据集,其中目标变量是加州地区的房屋价值中值,以数十万美元(100,000 美元)表示。
然后,像往常一样,我们需要将数据集拆分为训练和测试部分,并创建多项式特征。在这种情况下,我们使用的度数为 2,这意味着我们将创建二次特征。
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12)
-
- poly = PolynomialFeatures(degree=2)
- X_train_poly = poly.fit_transform(X_train)
- X_test_poly = poly.transform(X_test)
复制代码
然后我们需要训练我们的模型,并对模型在训练过程中没有看到的测试集进行预测。
- model = LinearRegression()
- model.fit(X_train_poly, y_train)
- y_pred = model.predict(X_test_poly)
复制代码
最后的强制性步骤是使用所选的评估指标评估模型。出于我们的目的,我们选择了 MSE 指标来衡量预测值和实际值之间的平均平方差。它为大错误赋予更高的权重,这有助于检测异常值或具有大错误的数据点。
- mse = mean_squared_error(y_test, y_pred)
- print("Mean squared error:", mse)
-
- >>> Mean squared error: 0.436677
复制代码
与在不使用多项式特征的情况下运行经典线性回归模型相比,MSE 误差更低(经典模型的 MSE = 0.53),并且证明您可以更多地试验这些技术以获得更好的模型生产率。
2.分类
分类用于对非结构化和结构化数据进行分类。该算法最常见的用例包括垃圾邮件过滤、视觉分类、自动标记和缺陷检测。您还可以在哪些其他类型的项目中使用它?
假设您的客户有一个客户服务部门,每天有数千个请求。Helpdesk 为与客户的每一次互动都贴上了标签。这样做是为了更好更快地导航客户的请求以及按主题对请求进行分组。
为了帮助您的客户实现他们的业务目标,您可以创建一个多标签分类模型,该模型将自动为新客户请求分配多个标签。业务解决方案将基于先前标记的客户数据。因此,客户服务专员不会将时间花在这项活动上,而是专注于更重要的任务。
在现实生活中处理分类任务时可能面临的问题之一是类别不平衡。当一个或多个类与其他类相比在训练数据中所占比例非常低时,就会出现不平衡。你怎么能解决这个问题?根据您使用的数据类型,有多种策略。
- 当涉及到数值时,可以通过过采样来解决问题。过采样涉及从次要类中随机选择示例,进行替换和轻微修改,并将它们添加到训练数据集中。
- 解决这个问题的另一个想法是为少数类分配更高的权重。因此,简而言之,您可以定义类的比例来改善结果。
让我们专注于克服实践中的不平衡问题。
对于这个例子,我生成了一个包含 64 个特征和 10,000 个样本的不平衡数据集,其中 70% 的样本属于多数类 [0],30% 属于次要类 [1]。
执行分类问题的相当经典的解决方案可能如下所示:
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.metrics import classification_report
-
- X, y = make_classification(n_samples=10000, n_features=64, n_informative=32, n_redundant=0, n_clusters_per_class=2, weights=[0.7, 0.3], class_sep=0.8, random_state=33)
-
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=33)
-
- rf = RandomForestClassifier(n_estimators=100, random_state=33)
- rf.fit(X_train, y_train)
-
- y_pred = rf.predict(X_test)
- print(classification_report(y_test, y_pred))
-
-
- >>> precision recall f1-score support
- >>>
- >>> 0 0.85 0.99 0.91 1379
- >>> 1 0.97 0.60 0.74 621
-
- >>> accuracy 0.87 2000
- >>> macro avg 0.91 0.80 0.83 2000
- >>> weighted avg 0.89 0.87 0.86 2000
复制代码
使用重采样技术,您可以对少数类进行过采样,对多数类进行欠采样,或结合使用两者。这可以使用像不平衡学习这样的库来实现。让我们看看这个应用了重采样技术的代码示例:
- ros = RandomOverSampler(random_state=33)
- X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
复制代码
我们使用“imblearn”库中的“RandomOverSampler()”对训练数据中的少数类进行过采样。这有助于通过为少数类别生成综合数据点来平衡类别。
除了这种方法之外,您还可以为少数类别分配更高的权重,为多数类别分配更低的权重。这可以使用分类器中的“class_weight”参数来完成。我们来看这部分代码:
- class_weights = compute_class_weight('balanced', classes=[0, 1], y=y_resampled)
复制代码
在这里,我们使用来自“sklearn.utils.class_weight”的“compute_class_weight()”函数计算类别权重。然后我们需要使用这些类权重来训练我们的分类器。
让我们总结一下解决不平衡类问题的分类问题的代码片段:
- from sklearn.datasets import make_classification
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.metrics import classification_report
- from imblearn.over_sampling import RandomOverSampler
- from sklearn.utils.class_weight import compute_class_weight
-
- X, y = make_classification(n_samples=10000, n_features=64, n_informative=32, n_redundant=0, n_clusters_per_class=2, weights=[0.7, 0.3], class_sep=0.8, random_state=33)
-
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=33)
-
- ros = RandomOverSampler(random_state=33)
- X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
-
- class_weights = compute_class_weight('balanced', classes=[0, 1], y=y_resampled)
- rf = RandomForestClassifier(n_estimators=100, random_state=33, class_weight={0: class_weights[0], 1: class_weights[1]})
- rf.fit(X_resampled, y_resampled)
-
- y_pred = rf.predict(X_test)
- print(classification_report(y_test, y_pred))
-
- >>> precision recall f1-score support
-
- >>> 0 0.88 0.99 0.93 1379
- >>> 1 0.96 0.71 0.82 621
-
- >>> accuracy 0.90 2000
- >>> macro avg 0.92 0.85 0.88 2000
- >>> weighted avg 0.91 0.90 0.90 2000
复制代码
正如您所看到的,比较使用和不使用防止类不平衡问题的技术获得的结果,使用第二种方法,指标整体变得更加可靠。
3.聚类
在聚类方面,此 ML 算法定义数据集中未标记的示例并将其分组。聚类使用无监督机器学习。这样就可以有效地处理和管理大型结构化数据集。在 MobiDev,我们通常使用聚类算法为企业带来有价值的见解。
想象一下,一家连锁超市的企业主想要分析员工的绩效并确定谁表现更好,谁表现不佳。众多员工在不同的超市工作,因此业主需要在降低运营成本的同时观察员工绩效的全貌。
为实现此业务目标,您可以构建用于异常检测的聚类模型。如果员工的行为不常见(不同于所有其他行为),则可以识别异常活动。通过使用聚类模型,可以识别行为模式与其他员工不同的员工。在这种情况下,尽管企业有足够的空间来实施其他 ML 算法,但聚类是管理性能问题和优化生产力的分析的第一阶段。
让我们考虑一下在实践中如何使用聚类方法进行异常检测。
在下面的代码示例中,我们首先使用“scikit-learn”库中的“make_blobs()”函数生成一个包含 1000 个样本、3 个中心且 cluster_std 等于 2.5 的演示数据集。然后,我们使用“StandardScaler()”缩放数据以确保所有特征都在同一比例上——这对于基于距离工作的算法很重要。
- import numpy as np
- import pandas as pd
- from sklearn.cluster import DBSCAN
- from sklearn.datasets import make_blobs
- from sklearn.preprocessing import StandardScaler
- import matplotlib.pyplot as plt
-
- # Generate a random dataset
- X, y = make_blobs(n_samples=1000, centers=3, cluster_std=2.5, random_state=42)
-
- scaler = StandardScaler()
- X = scaler.fit_transform(X)
复制代码
接下来,我们创建一个“eps”值为 0.3 且“min_samples”值为 5 的 DBSCAN 模型。我们将模型与数据进行拟合并获取聚类标签和聚类数。
- ' eps'(epsilon 的缩写)是每个数据点周围邻域的半径。此半径内的点被认为是彼此的邻居。
- 'min_samples'是形成密集区域所需的最少点数。如果一个点在“eps”的距离内至少有“min_samples”个邻居,那么它被认为是密集区域的一部分。
- # Apply DBSCAN algorithm
- dbscan = DBSCAN(eps=0.3, min_samples=5)
- dbscan.fit(X)
-
- # Obtaining model results
- labels = dbscan.labels_
复制代码
然后让我们绘制验证结果,以确保该算法按我们预期的方式工作。
- # Plotting data with anomalies marked with red color
-
- anomaly_color = '#ff0000'
- plt.scatter(X[:, 0], X[:, 1], color='#006666', s=20)
- plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color=anomaly_color, s=40)
- plt.show()
复制代码
从图中可以看出,基于聚类方法的异常检测算法过滤掉这些数据是有道理的,因此您可以在训练前将其从数据集中删除以清理数据。
最后,我们将识别异常并打印出检测到的异常数量。
- # Identify anomalies
- anomalies = X[labels == -1]
- print(f"Number of anomalies: {len(anomalies)}")
-
- >>> Number of anomalies: 10
复制代码
请注意,“eps”和“min_samples”值的选择将取决于数据集的具体情况和手头的问题。您可能需要尝试不同的值才能找到最佳结果。
如果您想使用聚类模型来识别常见模式,异常会阻止您的模型发挥作用。它们可以模糊整个画面,在某些情况下,它们需要从模型中排除。换句话说,不仅识别异常,而且对数据进行分组都有助于改进您的模型并实现客户的业务目标。
在为项目使用 ML 算法之前
机器学习算法的世界令人兴奋,但也充满惊喜。客户并不总是了解将AI 创意转化为真实产品的过程是什么样的。以下是项目第一阶段的情况。
我有几个技巧可以帮助您避免采用 ML 算法时最常见的陷阱:
- 运行时始终很重要,即使客户没有告诉您。
- 考虑开发过程中的速度。最好从头开始编写优化代码。
- 最大限度地使用 GPU / CPU 资源。
- 多处理是并行化的一个很好的选择。
- 使用流水线运行方法编写一个项目——让未来部署模型时的生活更轻松。
有了 ML 算法的所有机会,您应该非常小心如何实现它们。无论您选择哪种模型,请记住更好的数据比算法更重要,可以通过延长训练时间来增强算法。祝你好运!
中文版ChatGPT
https://chat.aboutyun.com/
加微信赠送Chat GPT教程:
获取更多资源:
领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480
大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235
名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732
|