一、文件读取
白葡萄酒读数据
使用
csv
模块,需要打开文件操作,不能使用pandas
1
2
3
4
5import csv
path = "white_wine.csv"
file = open(path, 'r')
content = list(csv.reader(file))
content[0:5]注意一下
csv
模块和pandas
模块读取数据的区别- 使用
pandas
读取数据会默认将第一行数据作为列名,csv
则不会 pandas
可以使用read_csv(path, header=None)
来修改默认格式,将使用数字作为列名
- 使用
二、数据处理
数据处理
B
回归模型
使用
sklearn.linear_model
中的LinearRegression
训练模型都是使用
fit()
1
2
3from sklearn.linear_model import LinearRegression as lr
model = lr().fit(df_trainx, df_trainy)
predict_value = model.predict(df_testx)同上
同上
三、二分类问题模型评价
正确率
常见的评价指标,分类正确的样本占总样本的比例
1
2
3
4
5import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score
accuracy_rate = accuracy_score(y_true, y_pred)注意一下,这类评价函数都是第一个放
y_true
,第二个放y_pred
,正确值放前面, 预测值放后面召回率
需介绍混淆矩阵,二分类情况下,准确值和预测值的组合有四种,多分类会有更多的组合
将四种组合分为四种类型
预测 $ 0 $ | 预测 $ 1 $ | |
---|---|---|
真实 $ 0 $ | tn | fp |
真实 $ 1 $ | fn | tp |
tn
:真负类,实际为负,预测为负
tp
:真正类,实际为正,预测为正
fp
:假正类,实际为负,预测为正
tn
:假负类,实际为正,预测为负
四种类型没有交集,总和为样本总数,tp + tn =
预测正确的样本,fp + fn
为预测错误的样本
精准率:
- 表示预测出来的样本中,正确的样本所占比例
- 显然需要预测出来,即预测值为
1
中正确的比例 $ p = \frac{TP}{FP + TP} $
召回率:
又称为查全率,即预测出来的占该类总数的比例
- 显然分子为
tp
,分母则为该类的全体,为fn + tp
$ R = \frac{TP}{TP + FN} $
1
2
3
4
5import numpy as np
import pandas as pd
from sklearn.metrics import recall_score, accuracy_score
rec_rate = round(recall_score(y_true, y_pred), 2) # 5留双
特异度
即负样本的召回率,查全率
显然 $ P = \frac{TN}{TN + FP} $
注意返回矩阵类型是
ndarray
,所以实际内容和上面的表格一样1
2
3
4
5from sklearn.metrics import confusion_matrix
a = confusion_matrix(y_true, y_pred)
tn = a[0][0]
fp = a[0][1]
spe_value = round(tn / (tn + fp), 2)kappa
值(😂,这个不是背靠背品牌
Kappa
是用于计算分类精度和评价一致性的指标。其中, $ P_o $ 为准确率,表明实际一致率,即混淆矩阵中对角线单元格中所有值的总和所占的比例; $ p_e $ 为正确预测的各分类数值的期望,表明理论一致率。
sklearn
里面已经实现过了1
2from sklearn.metrics import cohen_kappa_score
kappa_score=round(cohen_kappa_score(y_true, y_pred), 2)AUC
值AUC
被定义为ROC
曲线下的面积受试者工作特征曲线 (receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在两种不同的判定标准下所得的结果而已。受试者工作特征曲线就是以假阳性概率(False positive rate)为横轴,真阳性(True positive rate)为纵轴所组成的坐标图,和受试者在特定刺激条件下由于采用不同的判断标准得出的不同结果画出的曲线。
ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛
— 百度百科ROC
曲线的坐标,纵坐标为真正例率(True Positive Rate,TPR)
,横坐标为假正例率(False Positive Rate,FPR)
其中
1
2from sklearn.metrics import roc_auc_score
auc_value=round(roc_auc_score(y_true, y_prob), 2)
- 回归问题的平均绝对误差
MAE
1
2
from sklearn.metrics import mean_absolute_error as mae
mae_value = round(mae(y_true, y_pred), 2)
回归问题的均方误差
MSE
平方误差的期望,顾名思义可得:
1
2from sklearn.metrics import mean_squared_error as mse
mse_value=round(mse(y_true, y_pred), 2)回归问题的均方根误差
MSE
就是
MSE
的方根1
2
3
4
5from sklearn.metrics import mean_squared_error as mse
import numpy as np
import pandas as pd
import math
rmse_value=round(math.sqrt(mse(y_true, y_pred)), 2)
回归问题的 $ R^2 $ 系数
可以用来度量模型的拟合程度
在评判回归模型优劣的指标中,决定系数 $ R2 $ 指的是回归平方和占总误差平方和的比例。它是表征回归方程在多大程度上解释了因变量的变化,或者说方程对观测值的拟合程度如何。 $ R2 $ 越趋近于 $ 1 $ ,说明回归方程拟合的越好, $ R2 $ 越趋近于 $ 0 $ ,说明回归方程拟合的越差。
$ R2 $ 的有效性通常要求: $ \frac{\text{自变量个数}}{\text{样本数}} \gt \frac{1}{10} $
需要注意的是 $ R2 $ 仅适用于线性回归模型的评价。
1
2from sklearn.metrics import r2_score
r_square_value=round(r2_score(y_true, y_pred), 2)
信息熵
信息熵,物理中出现过这个概念,计算公式为 $ H = -x\log{x} $
在信息论与概率论中,熵是表示随机变量不确定性的度量,设 $ Y $ 是一个取有限个值的离散随机变量,其概率分布为: $ P(Y=y_i) = p_i, \quad i = 1,2,\cdots, n $
则随机变量 $ Y $ 的熵定义为: $ H(Y) = -\sum_{i=1}^n p_i \ \textbf{log} \ p_i $
上式中,若 $ p_i = 0 $ ,则定义 $ 0\ \textbf{log} \ 0 = 0 $ ,计算的时候对数以 $ 2 $ 底,这时熵的单位称作比特(bit)。由定义可知,熵只依赖于 $ Y $ 的分布,而与 $ Y $ 的具体取值无关。所以也可将 $ Y $ 的熵记作 $ H(p) $ ,即 $ H(p) = -\sum_{i=1}^n p_i \ \textbf{log} \ p_i $
注意需要首先计算出概率分布
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import pandas as pd
from scipy import log2
import numpy as np
sum = 0
mp = {}
row = y.shape[0]
for i in range(row):
tmp = y.iloc[i, 0]
if mp.get(tmp) == None:
mp[tmp] = 1
else:
mp[tmp] = mp[tmp] + 1
for key in mp:
p = mp[key] / row
if p != 0:
sum = sum - p * log2(p)
entropy_value = round(sum, 2)
四、距离
- 欧几里得距离
~ python
import numpy as np
from math import sqrt
dis = round(np.sqrt(np.dot((x1 - x2).T, (x1 - x2))), 2)
~
余弦相似度
夹角
1
2
3import numpy as np
from numpy.linalg import norm
cos_value = round(np.dot(x1, x2) / np.linalg.norm(x1) / np.linalg.norm(x2), 2)Jaccard
距离Jaccard
距离(或相似度)通常用作衡量两个集合之间的相似度——比如Cathy
的朋友集合表示为AKahn,Mark,Laura,⋯AKahn,Mark,Laura,⋯,Rachel
的朋友集合表示为BMladen,Kahn,Mark,⋯BMladen,Kahn,Mark,⋯
,那么两个朋友集合的Jaccard
相似度为:1
2
3
4import numpy as np
inter = len(np.intersect1d(x1, x2))
uni = len(np.union1d(x1, x2))
jaccard_dis = round(1 - inter / uni, 2)
Hamming
距离在信息论中,两个等长字符串之间的汉明距离
(Hamming distance)
是两个字符串对应位置的不同字符的个数。Hamming
距离主要用于衡量两个字符串,字组或者具有相同长度的DNA
序列之间的相似程度。比如单词olive
和ocean
的Hamming
距离为4
,因为除了第一个字母o
相同之外,这两个单词包含的其他四个字母都不相同。因此Hamming
距离的计算方式其实十分简单,按照位置顺序,比对两个单词(或者字符串)字母之间是否相同,每个位置上字母不同的,相应Hamming
距离的值增加1
。Hamming
距离是以Richard Wesley Hamming
的名字命名的,Hamming
在误差检测与校正码的基础性论文中首次引入这个概念。在通信中累计定长二进制字中发生翻转的错误数据位,所以它也被称为信号距离。Hamming
重量分析在包括信息论、编码理论、密码学等领域都有应用。1
2
3
4
5
6
7hamming_dis = None
l1 = min(len(x1), len(x2))
ans = 0
for i in range(l1):
if x1[i] != x2[i]:
ans = ans + 1
hamming_dis = max(len(x1), len(x2)) - l1 + ans曼哈顿距离
1
2
3
4
5
6
7import math
manhattan_dis = None
l = len(x1)
ans = 0
for i in range(l):
ans = ans + abs(x1[i] - x2[i])
manhattan_dis = round(ans, 2)