网站首页 > 技术文章 正文
全文共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学习与发展的干货
如转载,请后台留言,遵守转载规范
- 上一篇: 利用PCA和SVM算法建立人脸识别模型
- 下一篇: 「Python图像识别」10.5
猜你喜欢
- 2024-11-24 7000字,Python分析:泰坦尼克号中女生更容易生还?
- 2024-11-24 SVM 算法 和 梅尔倒谱系数 结合使用噪音检测的应用
- 2024-11-24 scikit-learn的5大新功能
- 2024-11-24 机器学习集成方法:Bagging, Boosting, Stacking, Voting, Blending
- 2024-11-24 Kaggle练习赛---Titanic的分析与整理
- 2024-11-24 超参数自动调参库介绍
- 2024-11-24 支持向量机SVM(Support Vector Machine) Ⅰ原创 Yu
- 2024-11-24 集成学习小介
- 2024-11-24 如何利用手机远训练机器学习模型
- 2024-11-24 使用SVC支持向量机算法来进行人脸识别的CNN神经网络训练
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)