# coding=utf-8
# 有监督学习:分类和回归
# 分类:模型用来预测样本所属类别
# 回归:当所要预测的样本结果为连续数值时
# 无监督学习,聚类和降维
# 聚类将整个数据集划分为若干个不相交的子集,每个子集被称为一个簇
# 降维:顾名思义降低数据的维度,将数据从高维空间映射到低维空间
print("***************回归算法的评估指标***************")
# 回归模型的评估指标 1、绝对误差,2、均分误差
# 绝对误差(mean_absolute_error)
# 绝对误差即预测点与真实点之间距离之差的绝对值的平均值
from sklearn.metrics import mean_absolute_error
y_true = [[0.5,1],[-1,1],[7,-6]]
y_pred = [[0,2],[-1,2],[8,-5]]
print("绝对误差是:"+str(mean_absolute_error(y_true,y_pred)))
# 均方误差(mean_squared_error)
# 均方误差即预测点与实践点之间距离之差平方和的均值
from sklearn.metrics import mean_squared_error
print("均方误差是:"+str(mean_squared_error(y_true,y_pred)))
print("*******分类算法的评估指标***********")
# 分类模型的评估指标,1、准确率2、精度(查准率)、3(召回率)查全率4、f1
# 分类模型的评估指标较多,准确率(accuracy)
# 准确率就是用来衡量模型对数据集中样本预测正确的比例,即等于所有预测正确的样本数目与所有参与预测的样本的总数目的比
# accuracy = 预测正确的样本数目/参加预测的样本总数目
from sklearn.metrics import accuracy_score
y_true = [1,0,2,0,1,0,2,0,0,2]
y_pred = [1,0,1,0,0,0,2,0,2,1]
Accuracy = accuracy_score(y_true,y_pred,normalize=True)
print("准确率:"+str(Accuracy))
# 精度(precision)指的是所有预测为正例的样本(TP+FP)中真正为正例的样本(TP)的比率。
# 又叫查准率precision = TP(真正的正例)/TP+FP(预测的正例)
# y_true是验证集的实际类别,y_pred是验证集的预测类别,参数average有None,binary,macro,weighted,micro
# 默认为binary适用于二分类
# NOne,会直接返回各个类别的精度列表
# macro,直接计算各个类别的精确度的平均(这在类别不平衡时不是一个好的选择)
# 当选择weight时,可通过对每个类别的score进行加权求得。
# 当选择micro时,在多标签问题大类将被忽略
# 查准率在购物推荐中比较重要
from sklearn.metrics import precision_score
precision = precision_score(y_true,y_pred,average=None)
print("精度:"+str(precision))
# 结果[0.8 0.33333333 0.5 ]
# 分别为0,1,2三个类别的查准率
# 0: y_pred预测结果中:TP=4 ,(TP+FP)=5 precision(0) = TP/(TP+FP) = 0.8
# 1: y_pred预测结果中:TP=1 ,(TP+FP)=3 precision(1) = TP/(TP+FP) = 0.33333
# 2: y_pred预测结果中:TP=1 ,(TP+FP)=2 precision(1) = TP/(TP+FP) = 0.5
# 召回率(recall)
# 召回率指的是所有为正例的样本(TP+FN)中真的正例(TP)的比率,用来评判你有没有
# 把样本中所有的真的正例全部找出来又叫查全率
# recall= TP/TP+FN
# 查全率在犯罪审核,医疗检测上等行为中比较重要
from sklearn.metrics import recall_score
Recall = recall_score(y_true,y_pred,average=None)
print("查全率:"+str(Recall))
# 0: TP+FN = 5 , TP = 4 precision(0) = 0.8
# 1: TP+FN = 2 , TP = 1 precision(1) = 0.5
# 2: TP+FN = 3 , TP = 1 precision(2) = 0.3333
# F1值
# 在搜索引擎等任务中,用户关注的是“检索出的信息有多少是用户感兴趣的”,“用户感兴趣的标签有多少
# 被检索出来了”,这个时候查准率和查全率比较符合,但是
# 查全率和查准率是一对相对矛盾的量
# F1只是recall和precision的一个平衡点,它是另外一种度量方式
# F1 = 2*P*R/P+R
from sklearn.metrics import f1_score
f1 = f1_score(y_true,y_pred,pos_label=1,average=None)
print("f1:"+str(f1))
# 以上也可以作为一个整体用函数classification_report进行输出
# support是预测的个类别下的样本数量
from sklearn.metrics import classification_report
target_names = ['0','1','2']
print(classification_report(y_true,y_pred,target_names=target_names))
# ROC曲线
# AUC
# 混淆矩阵
print("******************聚类算法的评估指标***************")
# 聚类模型的评估指标
# 1、外部指标(External Index)
# 2、外部指标
# 3、轮廓系数
print("******************常用距离公式*****************")
# 常用距离公式
# 1、曼哈顿距离
from numpy import *
vector1 = mat([2.1,2.5,3.8])
vector2 = mat([1.0,1.7,6.6])
print("曼哈顿距离:"+str(sum(abs(vector1-vector2))))
# 2、欧氏距离
print("欧式距离:"+str(sqrt((vector1-vector2)*(vector1-vector2).T)))
# 3、闵可夫斯基距离
# 可以看做是欧式距离的一种推广
# 4、切比雪夫距离
# 即是无穷极数,d = max(|x1 - x2|)
print("切比雪夫距离:"+str(abs(vector1-vector2).max))
# 5、夹角余弦
# 取值范围为[-1,1],可以用来衡量两个向量方向的差异,夹角余弦值越大,表示两个向量的夹角越小。
# 当两个向量的方向重合时,夹角余弦最大为1,当两个向量的方向完全相反时,夹角余弦最小值-1
import numpy as np
vector1 = np.array([2.1,2.5,3.8])
vector2 = np.array([1.0,1.7,6.6])
print("余弦距离:"+str(vector1.dot(vector2)/(np.linalg.norm(vector1)*np.linalg.norm(vector2))))
# 6、汉明距离,字符串中不相同数的数目
# 7、杰卡德相似系数
# 8、杰卡德距离