人类具有较强的学习能力,普通孩童经过训练后能够通过一定特征辨别出家中的自行车与小汽车
如小汽车具有四轮而形似方块,自行车仅具两轮而形体略小
一段时间后,该孩童能够对于新样本进行正确分类,例如对于邻居家的汽车/自行车能够正确区分
由此可见人类具有从一定规模数据中进行归纳的能力
机器学习(Machine Learning):
深度学习(Deep learning):
概念 | 功能 | 举例 |
---|---|---|
算法(Algorithm) | 用于训练模型的方法 | 简单线性回归算法、 SVM、逻辑回归算法 KNN算法、k-means算法、 |
模型 (Model) | 算法所训练出的结果 | = 1 + 0 |
参数 (Parameter) | 用于描述一个具体的模型的参数, 其取值可以由训练集训练得出 | 1和0 |
超参数(Hyperparameter) | 控制机器学习过程并确定学习算法 最终学习的模型参数值的参数 | 如Splitting ratio, learning rate, # of clusters |
目前,数据分析的主要实现方式中包括机器学习与统计学,因此可以对二者进行一个辨析。
序号 | 机器学习 | 统计学 |
---|---|---|
1 | 学习(Learn) | 拟合(Fit) |
2 | 算法(Algorithm) | 模型(Model) |
3 | 分类器(Classifier) | 假设(Hypothesis) |
4 | 无监督学习(Unsupervised Learning) | 聚类(Clustering) 密度估计(Density Estimation) |
5 | 有监督学习(Supervised Learning) | 分类(Classification) 回归(Regression) |
6 | 网络(Network)/图(Graph) | 模型(Model) |
7 | 权重(Weights) | 参数(Parameters) |
8 | 特征(Feature)矩阵 | 自变量(Independent Variable) |
9 | 目标(Target)向量 | 因变量(Dependent Variable) |
数据集在数学上通常表示为{(x1,y1),(x2,y2),…,(xi,yi),…}的形式
在有监督学习中数据通常分为训练集和测试集两部分,有时对训练集进一步划分为训练集和验证集。
留出法(Hold-Out Method):
优点:
缺点:
K折交叉验证
过程:
评价:
分层抽样策略(Stratified k‐fold):
将数据集划分成k份,特点在于,划分的k份中,每一份内各个类别数据的比例和原始数据集中各个类别的比例相同。
我们常用网格搜索来对超参数进行调整
超参数(Hyperparameter): 指在学习过程之前需要设置其值的一些变量,而不是通过训练得到的参数数据。如深度学习中的学习速率等就是超参数。
网格搜索举例:
概念:
阶段:
类别:
假设只有两类样本,即正例(positive)和负例(negative)。 通常以关注的类为正类,其他类为负类
预测为P | 预测为N | |
---|---|---|
实际为P | TP | FN |
实际为N | FP | TN |
分类性能度量—准确率
分类准确率(accuracy):分类器正确分类的样本数与总样本数之比:
在此表格中 accuracy = (TP+TN)/(TP+FN+FP+TN)
分类性能度量—精确率和召回率
精确率(precision): 反映了模型判定的正例中真正正例的比重。
在此表格中 precision = TP/(TP+FP)
召回率(recall): 反映了总正例中被模型正确判定正例的比重。
在此表格中 recall = TP/(TP+FN)
分类性能度量—P-R曲线
在图像中绘制出P-R曲线,横坐标为recall,纵坐标为precision。
而该曲线与坐标轴围成的面积区域为Area(Area Under Curve)
Area避免了精确率与召回率的局限性,而是反映了全局性能。
分类性能度量——F值
F值(—)是 精确率和召回率的调和平均:
— =((1+2)×precision×recall)/(2×precision+recall)
而其中较为常用的则是F1:
F1— = (2×precision×recall)/(precision+recall)
分类性能度量——ROC
横轴:假正例率 fp rate = FP/N
纵轴:真正例率 tp rate = TP/P
ROC(receiver operating characteristic curve)
回归分析(regression analysis)
对于回归问题的常用评价指标
平均绝对误差 MAE
是绝对误差损失的期望值
如果
y ^ 是第 i 个样本的预测值 y i 是相应的真实值 在 n s a m p l e s 个测试样本上 {\widehat{y}} 是第i个样本的预测值\\ y_i是相应的真实值\\ 在{n_{samples}}个测试样本上\ y 是第i个样本的预测值yi是相应的真实值在nsamples个测试样本上
平均绝对误差MAE的定义如下
M A E ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ∣ y i − y ^ ∣ MAE(y,\widehat{y})=\frac{1}{n_{samples}}\sum_{i=0}^{n_{samples}-1}{\vert y_i - \widehat{y}\vert} MAE(y,y )=nsamples1i=0∑nsamples−1∣yi−y ∣
均方差 MSE
该指标对应于平方误差损失 (squared error loss) 的期望值。
如果
y ^ 是第 i 个样本的预测值 y i 是相应的真实值 在 n s a m p l e s 个测试样本上 {\widehat{y}} 是第i个样本的预测值\\ y_i是相应的真实值\\ 在{n_{samples}}个测试样本上\ y 是第i个样本的预测值yi是相应的真实值在nsamples个测试样本上
均方差MSE的定义如下
M S E ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ∣ y i − y ^ i ∣ 2 MSE(y,\widehat{y})=\frac{1}{n_{samples}}\sum_{i=0}^{n_{samples}-1}{\vert y_i - \widehat{y}_i\vert}^2 MSE(y,y )=nsamples1i=0∑nsamples−1∣yi−y i∣2
均方根误差RMSE是均方误差MSE的平方根。
交叉熵损失 Log loss
常用于评价逻辑回归LR和深井网络
假设某样本的真实标签取值为(0或1),概率估计为p = pr(y=1)
每个样本的log loss是对分类器给定真实标签的负log似然估计
Llog(y,p)=-log(pr(y|p))=-ylog§+(1-y)log(1-p)
利用EXCEL打开本地的鸢尾花数据集如下:
链接:鸢尾花数据集-百度网盘
提取码:adgf
方法一:安装Anaconda
直接Anaconda官网安装即可 里面集成了许多重要模块 相应的配置教程能够在CSDN博客中找到。
方法二:创建虚拟环境+pip安装
1.选择工作区 我选择了D盘下的python opencv文件夹(个人自己决定 不必保持一致)
2.cmd环境下安装virtualenv 便于创建虚拟环境 pip install virtualenv
3.在你选定的工作区下创建虚拟环境 如virtualenv venv
4.在venv/Scripts中进入cmd环境 输入activate激活虚拟环境
5.安装必须的包
在激活的虚拟环境中执行下列语句:
pip install Numpy -i https://pypi.douban.com/simple
pip install scipy -i https://pypi.douban.com/simple
pip install matplotlib -i https://pypi.douban.com/simple
pip install scikit-learn -i https://pypi.douban.com/simple
pip install jupyter -i https://pypi.douban.com/simple
能够成功导入而不报错
至此就安装好了必备的环境 将使用jupyter notebook进行代码的编写
"""
# 绘制P-R曲线(精确率-召回率曲线)
"""
print(__doc__)
# 绘制P-R曲线(精确率-召回率曲线)
# plt:绘图
import matplotlib.pyplot as plt
# np:处理矩阵运算
import numpy as np
# svm:支持向量机
# datasets:数据集模块 后续使用该模块导入"鸢尾花数据集"
from sklearn import svm, datasets
# precision_recall_curve:精确率-召回率曲线
from sklearn.metrics import precision_recall_curve
# average_precision_score:根据预测分数计算平均精度(AP)
from sklearn.metrics import average_precision_score
# train_test_split:训练集与测试集的拆分模块
from sklearn.model_selection import train_test_split
# label_binarize:标签的二处理
from sklearn.preprocessing import label_binarize
# OneVsRestClassifier:一对其余 每次将某一类作为正类 其余作为负类
from sklearn.multiclass import OneVsRestClassifier
# 导入鸢尾花数据集
iris = datasets.load_iris()
# x为数据集的样本特征矩阵 150*4
x = iris.data
# y是类别标签矩阵 150*1
y = iris.target
y
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
# 将y转化为150*3的矩阵 目的是为转化为两类的分类问题 y中数值不是0即是1
# Binarize the output 标签二值化 将三个类转为001,010,100的格式,
# 因为这是个多类分类问题 转化完成后将采用OneVsRestClassifier策略转化为二类分类问题
y = label_binarize(y, classes=[0, 1, 2])
# y.shape = (150, 3)
# n_classes为y的列数
# 即n_classes=3
n_classes = y.shape[1]
print(y)
[[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[1 0 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 1 0]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]
[0 0 1]]
# Add noisy features 增加了800维的噪声特征
random_state = np.random.RandomState(0)
n_samples, n_features = x.shape
# n_samples=150 n_features=4
(150, 4)
# 在150×4的矩阵后增加了150*800的矩阵
x = np.c_[x, random_state.randn(n_samples, 200*n_features)]
# 进行训练集与测试集的拆分 比例为0.5
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=.5,random_state = random_state)
# 构建分类器 进行二类问题的转化
classifier = OneVsRestClassifier(svm.SVC(kernel='linear',probability=True,random_state=random_state))
# 利用训练集进行拟合 并将测试集传入获取对测试集中y值的预测
y_score = classifier.fit(x_train,y_train).decision_function(x_test)
# 将y_score这个预测值与每个样本的真实值进行比较
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):
#下划线是返回的阈值。作为一个名称:此时“_”作为临时性的名称使用。
#表示分配了一个特定的名称,但是并不会在后面再次用到该名称。
precision[i], recall[i],_ = precision_recall_curve(y_test[:,i],y_score[:,i])
average_precision[i] = average_precision_score(y_test[:,i],y_score[:,i])
# 切片 第i个类的分类结果性能
# Compute micro-average curve and area. ravel()将多维数组降为一维
precision['micro'],recall['micro'],_ = precision_recall_curve(y_test.ravel(),y_score.ravel())
average_precision['micro'] = average_precision_score(y_test, y_score, average='micro')
plt.clf()# 清楚当前图像窗口
plt.plot(recall['micro'],precision['micro'],label='micro-average Precision-recall curve (area ={0:0.2f})'.format(average_precision['micro']))
[]
for i in range(n_classes):
plt.plot(recall[i], precision[i], label='Precision recall curve of class {0} (area = {1:0.2f})'.format(i,average_precision[i]))
#调整刻度范围
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.05])
# 横纵坐标
plt.xlabel('Recall',fontsize=16)
plt.ylabel('Precision',fontsize=16)
# 图像名称 图例
plt.title('Extension of Precision-Recall curve to multi-class',fontsize=16)
plt.legend(loc="lower right")
plt.show()