三种机器学习类型!带你在流行的python库scikit-learn中演练

liftword3周前 (12-04)技术文章17

全文共5835字,预计学习时长16分钟

机器学习问题一般可以分为三种类型,包括被称为监督学习的分类和回归,和无监督学习,无监督学习在机器学习中通常是指聚类。

本文将简要介绍这三个问题,并在流行的python库scikit-learn中演练。

在开始之前,先简要解释监督和无监督学习术语的含义。

监督学习:在监督学习中,有一组已知的输入(特征)和一组已知的输出(标签)。一般把输入特征和输出标签叫做X和y。该算法的目标是学习将输入映射到输出的映射函数。从而当给出新的X示例时,该机器可以正确地预测相应的y标签。

无监督学习:在无监督的学习中,只有一组输入(X),没有对应的标签(y)。该算法的目的是在数据中找到之前未发现的规律。这些算法常常被用来寻找X的类似样本的有意义的聚类,因此实际上可以找到数据的内在类别。

1. 分类

在分类中,输出(y)是类别。类别可以只有两种,比如说可以把邮件分成垃圾邮件和非垃圾邮件。类别也可以有很多种,例如对花的种类进行分类,这被称为多类分类。

接下来用scikit-learn来举一个关于分类的简单例子。如果您尚未安装scikit-learn,可以通过pip或conda安装。

Scikit-learn有许多可以通过库直接访问的数据集。在本文中为了方便,整个过程中使用的数据集都是这些示例数据集。下面使用属于多类分类的葡萄酒数据集来说明分类问题。在数据集中,输入(X)包含13个与每种葡萄酒类型的各种属性相关的特征。已知的输出(y)是数据集中已经给出的用数字0,1或2代表的葡萄酒类型。

本文中使用的所有代码的导入如下所示。

import pandas as pd

import numpy as npfrom sklearn.datasets import load_wine

from sklearn.datasets import load_bostonfrom sklearn.model_selection importtrain_test_split

from sklearn import preprocessingfrom sklearn.metrics import f1_score

from sklearn.metrics import mean_squared_error

from math import sqrtfrom sklearn.neighbors import KNeighborsClassifier

from sklearn.svm import SVC, LinearSVC, NuSVC

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier,GradientBoostingClassifier

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis

from sklearn import linear_model

from sklearn.linear_model import ElasticNetCV

from sklearn.svm import SVRfrom sklearn.cluster import KMeans

from yellowbrick.cluster import KElbowVisualizer

from yellowbrick.cluster import SilhouetteVisualizer

在下面的代码中,下载数据然后把它转换为pandas数据帧。

wine = load_wine()

wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)

wine_df['TARGET'] = pd.Series(wine.target)

监督学习问题中的下一个步骤是将数据拆分为测试集和训练集。算法可以使用训练集来学习输入和输出之间的映射,然后使用保留的测试集来评估模型是否学会了这种映射。在下面的代码中,使用scikit-learnmodel_selection函数train_test_split来执行此操作。

X_w = wine_df.drop(['TARGET'],axis=1)

y_w = wine_df['TARGET']

X_train_w, X_test_w, y_train_w, y_test_w = train_test_split(X_w, y_w,test_size=0.2)

在下一步中,需要选择最适合学习所选数据集中映射的算法。在scikit-learn有许多不同的算法可供选择,这些算法使用不同的函数和方法来学习映射,可以在这里查看完整列表。

运行以下代码来找出最好的模型。使用一系列算法训练模型,并获得每个算法的F1分数。F1分数是衡量分类器整体精度的良好指标。这里详细地写了可以用来评估分类器的各种指标。

classifiers = [

KNeighborsClassifier(3),

SVC(kernel="rbf", C=0.025,probability=True),

NuSVC(probability=True),

DecisionTreeClassifier(),

RandomForestClassifier(),

AdaBoostClassifier(),

GradientBoostingClassifier()

]

for classifier in classifiers:

model = classifier

model.fit(X_train_w, y_train_w)

y_pred_w = model.predict(X_test_w)

print(classifier)

print("model score:%.3f" %f1_score(y_test_w, y_pred_w, average='weighted'))

表示完美的F1得分是1.0,因此,数字越接近1.0,模型性能就越好。上述结果表明,随机森林分类器(Random Forest Classifier)是此数据集的最佳模型。

2. 回归

在回归中,输出(y)是连续的值,而不是类别。回归的典型例子是预测商店下个月的销售额,或者是预测您的房子的未来房价。

为了再次说明回归,下面将使用scikit-learn称为波士顿住房数据集的数据集。这个数据集包括13个特征(X),这些特征包含房屋的各种属性,例如房间数量,地点,建筑年龄和当地犯罪率。输出(y)是房价。

使用下面的代码处理数据,并使用在wine数据集中用的相同方法将其拆分为测试和训练集。

boston_df =pd.DataFrame(boston.data, columns=boston.feature_names)

boston_df['TARGET'] = pd.Series(boston.target)X_b = boston_df.drop(['TARGET'],axis=1)

y_b = boston_df['TARGET']

X_train_b, X_test_b, y_train_b, y_test_b = train_test_split(X_b, y_b,test_size=0.2)

可以使用这个速查表来查看适用于scikit-learn中回归问题的可用算法。接下来将使用类似于分类问题的代码来循环选择并打出每个分数。

评估回归模型有许多不同的指标。这些指标本质上都是误差度量,用来测量由模型实现的实际值和预测值之间的差异。这里使用了根均值平方误差(RMSE)。对于此度量,越接近零值则模型的性能越好。本文非常好地解释了回归问题的误差度量。

regressors = [

linear_model.Lasso(alpha=0.1),

linear_model.LinearRegression(),

ElasticNetCV(alphas=None,copy_X=True, cv=5, eps=0.001, fit_intercept=True,

l1_ratio=0.5, max_iter=1000,n_alphas=100, n_jobs=None,

normalize=False, positive=False,precompute='auto', random_state=0,

selection='cyclic', tol=0.0001,verbose=0),

SVR(C=1.0, cache_size=200, coef0=0.0,degree=3, epsilon=0.1,

gamma='auto_deprecated',kernel='rbf', max_iter=-1, shrinking=True,

tol=0.001, verbose=False),

linear_model.Ridge(alpha=.5)

]for regressor in regressors:

model = regressor

model.fit(X_train_b, y_train_b)

y_pred_b = model.predict(X_test_b)

print(regressor)

print("mean squarederror:%.3f" % sqrt(mean_squared_error(y_test_b, y_pred_b)))

RMSE评分表明线性回归和岭回归算法在此数据集中表现性能最佳。

3. 无监督学习

有许多不同类型的无监督学习,但为了简单起见,下文将重点关注聚类方法。有许多不同的聚类算法,这些算法查找输入集群的技术都略有不同。

使用最多的方法之一可能是K-means。该算法执行一个迭代过程,从而启动指定数量的随机生成装置。它计算从质心到每个数据点的距离度量,或者说欧氏距离,从而创建有类似值的聚类。每个集群的质心然后成为新的平均值,重复这个过程来找到最佳结果。

接下来使用在分类任务中用过的葡萄酒数据集,去掉y标签,看看k均值算法是否可以通过输入识别葡萄酒类型。

因为我们只使用这个模型的输入,所以我使用稍微不同的方法将数据分解为测试和训练集。

np.random.seed(0)

msk = np.random.rand(len(X_w)) < 0.8

train_w = X_w[msk]

test_w = X_w[~msk]

由于-Kmeans依赖于距离度量来确定集群,因此在训练模型之前通常需要执行特征缩放,确保所有特征都是相同的大小。下面的代码使用MinMaxScaler来缩放特征,确保所有值都在0和1之间。

x = train_w.values

min_max_scaler = preprocessing.MinMaxScaler()

x_scaled = min_max_scaler.fit_transform(x)

X_scaled = pd.DataFrame(x_scaled,columns=train_w.columns)

使用K-means必须指定算法应该使用的集群数量。因此,首先要做的事情之一是确定聚类的最佳数量。这是通过迭代多个k值并在图表上绘制结果来实现的。这被称为肘部方法,因为它通常会生成一个看起来有点像肘部的曲线。Yellowbrick库有一个对于可视化来说非常好的功能。下面的代码生成此可视化图像。(注:Yellowbrick库是一个很好的可视化scikit-learn模型的库,还可以通过pip安装)

model = KMeans()

visualizer = KElbowVisualizer(model, k=(1,8))

visualizer.fit(X_scaled)

visualizer.show()

通常在数据集中使用聚类技术的类别有多少是未知的。但在此处,已知的是数据中有三种葡萄酒类型-曲线已经正确选择了三种葡萄酒作为模型中使用的最佳集群数量。

下一步是初始化K均值算法,并将模型与训练数据进行拟合,并评估算法对数据进行聚类的有效性。

这里的一种方法叫做轮廓得分(SilhouetteCoefficient)。这个方法测量集群内值的一致性。换句话说,它测量每个集群中的值彼此的相似程度,以及集群之间的差异程度。为每个值计算轮廓分数,分数的范围是-1到+1。这些值绘制成轮廓图。同样,yellowbrick提供了一种简单的方法来构建这种轮廓图。以下代码用wine数据集生成了此可视化图。

model = KMeans(3, random_state=42)

visualizer = SilhouetteVisualizer(model,colors='yellowbrick')visualizer.fit(X_scaled)

visualizer.show()

可以通过以下方式解释剪影图:

· 平均得分(上面的红色虚线)越接近+1,则数据点在聚类中匹配得越好。

· 得分为0的数据点非常接近另一个聚类的决策边界(因此差异度较低)。

· 负值表示数据点可能在错误的集群。

· 每个库的宽度应该是合理均匀的,如果不是这样的话,那么使用的可能是错误的k值。

上面的葡萄酒数据集的图表显示,由于大多数数据点低于平均得分,并且部分数据点低于0,因此集群0可能不如其他集群一致性高。

轮廓分数在比较不同的算法或k值时尤其有用。

这篇文章简要介绍了三种机器学习类型。所有这些过程还涉及许多其他步骤,包括特征工程,数据处理和超参数优化,以确定最佳的数据预处理技术和最佳使用模型。

感谢阅读!

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范