机器学习可以大致分为三类:监督学习、无监督学习和其他类型的学习。本文将重点介绍这三种类型,并通过Python中的scikit-learn库演示它们的应用。
首先,我们简要解释一下监督学习和无监督学习的概念。
监督学习:在这种学习模式中,输入(特征)和对应的标签(目标变量)都是已知的。算法的目标是通过已知的输入和标签来学习一个映射函数,以便在给定新的输入时能够预测正确的标签。
无监督学习:与监督学习不同,在无监督学习中只有输入数据而没有标签。算法的目标是在数据中发现隐藏的结构或模式,例如将相似的数据点分组在一起形成聚类。
接下来,我们将详细介绍这三种学习类型,并通过具体的例子来说明。
分类是一种监督学习任务,其中输入(标签)是离散的类别。例如,可以将电子邮件分为垃圾邮件和非垃圾邮件,或者对花卉的种类进行分类。
我们使用scikit-learn库中的葡萄酒数据集来演示分类任务。该数据集包含13个与葡萄酒类型相关的特征,以及已知的葡萄酒类型标签。
以下是分类任务中使用的代码:
```python import pandas as pd import numpy as np from sklearn.datasets import loadwine from sklearn.modelselection import traintestsplit from sklearn.metrics import f1_score
wine = loadwine() winedf = pd.DataFrame(wine.data, columns=wine.featurenames) winedf['TARGET'] = pd.Series(wine.target)
Xw = winedf.drop(['TARGET'], axis=1) yw = winedf['TARGET'] Xtrainw, Xtestw, ytrainw, ytestw = traintestsplit(Xw, yw, test_size=0.2)
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(Xtrainw, ytrainw) ypredw = model.predict(Xtestw) print(classifier) print("model score: %.3f" % f1score(ytestw, ypred_w, average='weighted')) ```
在上述代码中,我们使用了多种分类器,并通过F1分数来评估模型性能。最终结果显示,随机森林分类器在该数据集上的表现最好。
回归是一种监督学习任务,其中输入(标签)是连续的值。例如,预测商店的月销售额或预测房屋的价格。
我们使用波士顿住房数据集来演示回归任务。该数据集包含13个房屋属性特征,以及房屋价格标签。
以下是回归任务中使用的代码:
```python import pandas as pd import numpy as np from sklearn.datasets import loadboston from sklearn.modelselection import traintestsplit from sklearn.metrics import meansquarederror from math import sqrt
boston = loadboston() bostondf = pd.DataFrame(boston.data, columns=boston.featurenames) bostondf['TARGET'] = pd.Series(boston.target)
Xb = bostondf.drop(['TARGET'], axis=1) yb = bostondf['TARGET'] Xtrainb, Xtestb, ytrainb, ytestb = traintestsplit(Xb, yb, test_size=0.2)
regressors = [ linearmodel.Lasso(alpha=0.1), linearmodel.LinearRegression(), ElasticNetCV(alphas=None, copyX=True, cv=5, eps=0.001, fitintercept=True, l1ratio=0.5, maxiter=1000, nalphas=100, njobs=None, normalize=False, positive=False, precompute='auto', randomstate=0, selection='cyclic', tol=0.0001, verbose=0), SVR(C=1.0, cachesize=200, coef0=0.0, degree=3, epsilon=0.1, gamma='autodeprecated', kernel='rbf', maxiter=-1, shrinking=True, tol=0.001, verbose=False), linear_model.Ridge(alpha=.5) ]
for regressor in regressors: model = regressor model.fit(Xtrainb, ytrainb) ypredb = model.predict(Xtestb) print(regressor) print("mean squared error: %.3f" % sqrt(meansquarederror(ytestb, ypredb))) ```
在上述代码中,我们使用了多种回归器,并通过均方根误差(RMSE)来评估模型性能。结果显示,线性回归和岭回归在该数据集上的表现较好。
聚类是一种无监督学习任务,其中目标是发现数据中的隐藏结构或模式。K-means是最常用的聚类算法之一。
我们使用葡萄酒数据集来演示K-means聚类任务。该数据集包含13个特征,但没有标签。我们的目标是通过K-means算法将数据点分为几个聚类。
以下是聚类任务中使用的代码:
```python import numpy as np import pandas as pd from sklearn.datasets import loadwine from sklearn.modelselection import traintestsplit from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans from yellowbrick.cluster import KElbowVisualizer, SilhouetteVisualizer
wine = loadwine() winedf = pd.DataFrame(wine.data, columns=wine.feature_names)
np.random.seed(0) msk = np.random.rand(len(winedf)) < 0.8 trainw = winedf[msk] testw = wine_df[~msk]
x = trainw.values minmaxscaler = MinMaxScaler() xscaled = minmaxscaler.fittransform(x) Xscaled = pd.DataFrame(xscaled, columns=trainw.columns)
model = KMeans() visualizer = KElbowVisualizer(model, k=(1, 8)) visualizer.fit(X_scaled) visualizer.show()
model = KMeans(nclusters=3, randomstate=42) visualizer = SilhouetteVisualizer(model, colors='yellowbrick') visualizer.fit(X_scaled) visualizer.show() ```
在上述代码中,我们使用了K-means聚类算法,并通过肘部方法和轮廓系数来评估聚类效果。最终结果显示,聚类效果良好,且大部分数据点的轮廓分数较高。
本文介绍了机器学习的三种基本类型,并通过具体例子展示了如何在Python中使用scikit-learn库实现这些任务。希望这些内容能帮助读者更好地理解和应用机器学习技术。