根据学习的任务模式 (训练数据是否有标签),机器学习可分为四大类:
- 有监督学习 (有标签)
- 无监督学习 (无标签)
- 半监督学习 (有部分标签)
- 增强学习 (有评级标签)
无监督模型包括,各种聚类分析(KMeans, DBSCAN)、主成分分析 (PCA)、独立成分分析 (ICA)、隐含狄利克雷分配 (LDA) 等等;
有监督相关模型如下图:
一、sklearn的自带数据集示意:
- 鸢尾花
数据集包括 150 条鸢尾花的四个特征 (萼片长/宽、花瓣长/宽) 和三个类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。
from sklearn.datasets import load_iris
iris = load_iris()
# 数据是以「字典」格式存储的,iris的键有:
print(iris.keys())
# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
- 手写数字(0-9)
from sklearn.datasets import load_digits
digits = load_digits()
print(digits.keys())
# dict_keys(['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'])
二、监督模型:
-
线性回归
对于函数 2 x + 1 2x+1 2x+1,示意如下:
import numpy as np
from sklearn.linear_model import LinearRegression
model = LinearRegression(normalize=True)
x = np.arange(10)
y = 2 * x + 1
X = x[:, np.newaxis]
model.fit(X, y)
print(model.coef_)
print(model.intercept_)
'''
[2.]
0.9999999999999982
'''
print(model.predict([[10]]))
# [21.]
设置超参数 normalize 为 True,指的在每个特征值上做标准化,这样会加速数值运算。
Sklearn 里模型要求特征 X 是个两维变量 (样本数×特征数),可以用 np.newaxis 加一个维度,把 [1, 2, 3] 转成 [[1], [2], [3]]。再把 X 和 y 丢进 fit() 函数来拟合线性模型的参数。
- 分类器-MLPClassifier
MLPClassifier 类实现了通过 Backpropagation 进行训练的多层感知器(MLP)算法。
MLPClassifier 通过应用 Softmax 作为输出函数来支持多分类。
from sklearn.neural_network import MLPClassifier
X = [[0, 0], [1, 1], [2, 2], [4, 4]]
y = [0, 0, 1, 1]
# clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
clf = MLPClassifier(alpha=1e-5)
clf.fit(X, y)
print(clf.predict([[3, 3]]))
print(clf.predict_proba([[3, 3]]))
# [1]
# [[0.0271484 0.9728516]]
其中,对于分类问题,我们不仅想知道预测的类别是什么,有时还想知道预测该类别的信心如何。
前者用 predict(),后者用 predict_proba()。
sklearn把「每行中最大概率值对应的那一类」作为预测结果,可以发现,predict_proba概率相加为1;
-
分类-多标签分类
在手写数字的例子上,为每个数字设计了多标签:
- 标签 1 - 奇数、偶数
- 标签 2 - 小于等于 4,大于 4
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.multiclass import OneVsRestClassifier
digits = load_digits()
print(digits.keys())
# dict_keys(['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'])
X_train, X_test, y_train, y_test = train_test_split(digits['data'], digits['target'], test_size=0.2)
y_train_multilabel = np.c_[y_train % 2 == 0, y_train <= 4]
print(y_train_multilabel)
'''
[[False True]
[False False]
[ True False]
...
[False True]
[False True]
[ True True]]
'''
ova_ml = OneVsRestClassifier(LogisticRegression(solver='lbfgs', max_iter=800))
ova_ml.fit(X_train, y_train_multilabel)
print(len(ova_ml.estimators_))
# 2
print(ova_ml.estimators_)
# [LogisticRegression(max_iter=800), LogisticRegression(max_iter=800)]
print(y_test[:1])
# [5]
print(ova_ml.predict(X_test[:1, :]))
# [[0 0]]
注:numpy— c_ & r_
c_ 和 r_,它们的作用是将两个矩阵拼接到一起。
其中,c_ 是将两个矩阵按列拼接到一起,相当于矩阵左右相加,拼接的矩阵行数要相等。
而,r_ 是将两个矩阵按行拼接,相当于矩阵上下相加,要求矩阵的列数相等。
参考:
- https://mp.weixin.qq.com/s?__biz=MzU0MDQ1NjAzNg==&mid=2247559334&idx=1&sn=ea98c833bdb665df9a89d57be3873493&chksm=fb3b4dadcc4cc4bbbd26d6fbeb706a747059203f8431927a8c1ab43fe94650ccd4e51d1669c3&scene=27
- https://blog.csdn.net/weixin_47867005/article/details/125966146