课程笔记
-
监督学习:
根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。也就是说,在监督学习中训练数据既有特征(feature)又有标签(label),通过训练,让机器可以自己找到特征和标签之间的联系,在面对只有特征没有标签的数据时,可以判断出标签。监督学习包括回归问题和分类问题
-
回归问题和分类问题的区别:
分类和回归的区别在于输出变量的类型:定量输出称为回归,或者说是连续变量预测;定性输出称为分类,或者说是离散变量预测。
举个例子:预测明天的气温是多少度,这是一个回归任务;预测明天是阴、晴还是雨,就是一个分类任务。 -
无监督学习:
我们不知道数据集中数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。可以这么说,比起监督学习,无监督学习更像是自学,让机器学会自己做事情,是没有标签(label)的。
通过使用sklearn生成符合自身需求的数据集
import numpy as np import matplotlib.pyplot as plt from sklearn.semi_supervised import LabelSpreading from sklearn.datasets import make_circles n_samples = 200 X, y = make_circles(n_samples=n_samples, shuffle=False) outer, inner = 0, 1 labels = np.full(n_samples, -1.) labels[0] = outer labels[-1] = inner label_spread = LabelSpreading(kernel='knn', alpha=0.8) label_spread.fit(X, labels) output_labels = label_spread.transduction_ plt.figure(figsize=(4, 4)) plt.subplot() plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy', marker='s', lw=0, label="outer labeled", s=10) plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color='c', marker='s', lw=0, label='inner labeled', s=10) plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color='darkorange', marker='.', label='unlabeled') plt.legend(scatterpoints=1, shadow=False, loc='upper right') plt.title("Raw data (2 classes=outer and inner)")
-
使用sklearn构建完整的机器学习项目流程,以boston项目为例
- 明确项目任务:房价为监督学习,回归问题,连续变量的预测
- 收集数据集并选择合适的特征
from sklearn import datasets import pandas as np boston = datasets.load_boston() # 返回一个类似于字典的类 X = boston.data y = boston.target features = boston.feature_names boston_data = pd.DataFrame(X,columns=features) boston_data["Price"] = y boston_data.head()
以上部分代码读取了数据,并对数据进行了简单的展示,我们可以认为输出y和输入数据x是一个线性关系
3. 选择度量模型性能的指标from sklearn.metrics import mean_absolute_error y_true = [3, -0.5, 2, 7] y_pred = [2.5, 0.0, 2, 8] mean_absolute_error(y_true, y_pred) 结果为0.5
可在sklearn.metrics选取合适的误差函数
4. 选择具体的模型并进行训练以优化模型
假设X和Y之间存在线性关系,模型的具体形式为 𝑦̂ =𝑓(𝑤)= w T x w^Tx wTx,关于线性模型可以使用最小二乘法解决
5. 评估模型的性能并调参
将训练结果与目标结果对比,计算精度
作业部分
-
对最小二乘法的解读
对与几何解释的理解:
线性模型构建的输入和输出的关系为y=wx,x可以是多维的向量(如在波士顿房价数据集中的平均房间数,一氧化氮浓度),y为房价,我们的目的是求出最佳的w,第一感觉最佳的w是能完全拟合这个数据集的输入和输出,使得所有的输入x都等得到输出y,但是数据集往往做不到这么精确。
也就是所有的y不一定能用x进行拟合,所以将y投影到x的列空间中计算最优w,将y的投影设为 y ^ \hat{y} y^,并且 y ^ = w ^ x \hat{y}=\hat{w} x y^=w^x ,由矩阵投影的性质有 X T ( Y − Y ^ ) = 0 X^T(Y-\hat{Y})=0 XT(Y−Y^)=0,即 X T ( Y − w ^ x ) = 0 X^T(Y-\hat{w}x)=0 XT(Y−w^x)=0所以 w = ( X T X ) − 1 X T Y w=(X^TX)^{-1}X^TY w=(XTX)−1XTY,此时求出的 w ^ \hat{w} w^为最优解
-
极大似然估计和最小二乘法的关系:
其实不太理解对于噪声假设为什么可以视为正太分布
-
决策树和线性模型的区别:第一次接触决策树是在《统计学习基础》这本书,结合书中内容和视频中的内容列举一些区别:
区别1:决策树很明显的不是线性模型
区别2:决策树在选择性能指标的时候有信息增益,信息增益比,基尼系数 线性模型采用平方误差比较多
区别3:以为决策数不是线性模型,在使用上比线性模型效果更广 -
使用线性模型拟合数据集:
import numpy as np
import numpy.linalg as lg
data=np.array([
[1,2,3,4],
[2,4,5,6],
[1,2,4,6],
[1,4,2,6],
[4,2,1,3],
[2,4,1,3],
[3,3,1,4],
])
target=np.array([
[21],[33],[24],[29],[18],[21],[21]
])
xTx=data.transpose().dot(data)
result=lg.inv(xTx).dot(data.transpose()).dot(target)
print(result)
使用的方法为最小二乘法,数据集的输入
x
⃗
=
[
x
1
,
x
2
,
x
3
,
x
4
]
\vec{x}=[x_1,x_2,x_3,x_4]
x=[x1,x2,x3,x4],设定输出y与输入x的线性关系为
y
=
2
∗
x
1
+
2
∗
x
2
+
2
∗
x
3
+
2
∗
x
4
]
y=2*x_1+2*x_2+2*x_3+2*x_4]
y=2∗x1+2∗x2+2∗x3+2∗x4],所以正确的目标参数为:
[
2
2
2
2
]
\begin{bmatrix} 2 \\ 2 \\ 2 \\ 2 \\ \end{bmatrix}
⎣⎢⎢⎡2222⎦⎥⎥⎤
在输出结果target(y)中将数据在目标数据上下波动一定的范围,通过最小二乘法拟合数据,求出的参数为:
[
0.93983034
2.93825212
1.30755573
2.17390018
]
\begin{bmatrix} 0.93983034 \\ 2.93825212 \\ 1.30755573 \\ 2.17390018 \\ \end{bmatrix}
⎣⎢⎢⎡0.939830342.938252121.307555732.17390018⎦⎥⎥⎤
通过拟合出来的结果和目标结果还是有一定相似性的