赞
踩
目录
1、平均绝对误差(Mean Absolute Error,MAE)
2、均方误差(Mean Squared Error,RMSE)
平均绝对误差,表示预测值和观测值之间绝对误差的平均值。MAE是一种线性分数,所有个体差异在平均值上的权重都相等,比如,10和0之间的绝对误差是5和0之间绝对误差的两倍,MAE很容易理解,它是对残差直接计算平均。
均方根误差,表示预测值与观测值之间差异(称为残差)的样本标准差。均方根误差为了说明样本的离散程度。做非线性拟合时,RMSE越小越好。
标准差与均方根误差的区别:
标准差是用来衡量一组数自身的离散程度,而均方根误差是用来衡量观测值同真值之间的偏差,他们的研究对象和研究目的不同,但是计算过程类似。
均方根误差算的是观测值与其真值,或者观测值与其模拟值之间的偏差,而不是观测值与其真值之间的偏差。
R平方值又称为决定系数(coefficient of determination),是用来评价一个回归模型的拟合优度。它表示回归模型的可以解释因变量方差的百分比,数值范围从0到1。
当R-squared等于0时,表示该回归模型无法解释目标变量的变异;
当R-squared接近0时,说明该回归模型的拟合效果不佳,不能够很好地解释目标变量的变异;
当R-squared接近1时,表示该回归模型的拟合效果很好,能够较好地解释目标变量的变异;
当R-squared等于1时,表示该回归模型完美地解释了目标变量的变异。
校正决定系数是用来评价回归模型的拟合优度的一个改进版本,相较于普通的R-squared具有一定的优势。校正决定系数考虑了解释变量数目和样本数目对统计分析的影响,并且可以更准确地反映出模型对未知数据的预测能力。
交叉验证是一种评估机器学习模型泛化性能的方法。通过将数据集划分为训练集和测试集,多次重复进行训练和测试来评估模型的性能,从而减少因训练集和测试集选择的偶然性带来的影响。
交叉验证可以有效地对模型进行评估和比较,在训练数据不充足、过拟合等问题出现时,交叉验证可以更好地评估模型的泛化性能,从而避免模型在实际应用中出现过度拟合和欠拟合的问题。但是需要注意的是,交叉验证的计算成本较高,并且难以处理大规模数据集,因此需要根据实际情况进行选择和应用。
欠拟合是指模型不能在训练集上获得足够低的误差。就是指模型复杂度低,模型在训练集上表现很差,没法学习到数据背后的规律。
过拟合是指训练误差和测试误差之间的差距太大。就是指模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了但不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。
欠拟合:模型学习到的样本的特征太少
过拟合:原始特征过多,存在一些嘈杂特征
欠拟合解决办法之多项式回归:
原理介绍:为了解决欠拟合的情形,经常要提高线性的次数(高次多项式)建立模型拟合曲线,次数过高可能导致过拟合,次数过低可能导致欠拟合。
代码演示:
- from sklearn.linear_model import LinearRegression
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.preprocessing import PolynomialFeatures # 用于解决欠拟合的问题的多项式回归
-
- # 自己定义训练数据
- x_train = [[6], [8], [10], [14], [18]] # 大小
- y_train = [[7], [9], [13], [17.5], [18]] # 价格
-
- # 进行阶数为一阶的线性回归和预测
- linear = LinearRegression()
- linear.fit(x_train, y_train)
-
- # 绘制基于出原始样本数据得出来的拟合曲线 + 散点图
- xx = np.linspace(0, 25, 100)
- xx = xx.reshape(-1, 1)
- yy = linear.predict(xx)
- plt.scatter(x_train, y_train)
- plt.plot(xx, yy)
- plt.show()
-
-
- """多项式回归解决出现的欠拟合问题"""
-
- # 建立二次多项式线性回归模型进行预测
- poly2 = PolynomialFeatures(degree=2) # 2次多项式特征生成器
- x_train_poly2 = poly2.fit_transform(x_train)
- # 建立模型预测
- linear2_poly2 = LinearRegression()
- linear2_poly2.fit(x_train_poly2, y_train)
-
- # 绘制基于多项式回归后得出来的拟合曲线 + 散点图
- xx_poly2 = poly2.transform(xx)
- yy_poly2 = linear2_poly2.predict(xx_poly2)
- plt.scatter(x_train, y_train)
- plt.plot(xx, yy, label="Degree = 1")
- plt.plot(xx, yy_poly2, label="Degree = 2")
- plt.legend()
- plt.show()
-
- """使用模型对未知价格的蛋糕进行价格的预测"""
- x_test1 = np.array([15]).reshape(1, -1)
- x_test1_poly2 = poly2.fit_transform(x_test1.reshape(1, -1))
- y_test1 = linear2_poly2.predict(x_test1_poly2)
- print(y_test1)
结果演示:
1、使用未经过多项式回归的样本数据,进行训练后的拟合结果(可见有些欠拟合,蓝色线为线性回归的结果,散点为各个样本数据。)
2、使用经过了多项式回归后的样本数据,进行训练后的拟合结果(与原拟合度相比有了显著的提升, 蓝色线为基于原数据的线性回归结果,黄色线为基于多项式回归后的数据的线性回归结果,散点为各个样本数据。)
过拟合解决办法之正则化处理 — Ridge岭回归
正则化处理原理介绍:将过拟合的曲线的凹凸幅度减小就可以使得过拟合的曲线趋近于拟合曲线了。所谓的过拟合曲线的凹凸肯定是由于线性回归方程中的高次项导致的,那么正则化就可以通过不断的尝试发现高次项的特征然后将这些特征的权重w调小到0,则高次项的特征就没有了,那么凹凸幅度也就减少了,就趋近于拟合曲线了。
代码演示:
- from sklearn.linear_model import LinearRegression
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.preprocessing import PolynomialFeatures # 用于解决欠拟合的问题的多项式回归
- from sklearn.linear_model import Ridge # 用于处理过拟合的正则化处理
-
- # 自己定义训练数据
- x_train = [[6], [8], [10], [14], [18]] # 大小
- y_train = [[7], [9], [13], [17.5], [18]] # 价格
-
- # 进行阶数为一阶的线性回归和预测
- linear = LinearRegression()
- linear.fit(x_train, y_train)
-
- # 绘制基于出原始样本数据得出来的拟合曲线 + 散点图
- xx = np.linspace(0, 25, 100)
- xx = xx.reshape(-1, 1)
- yy = linear.predict(xx)
- plt.scatter(x_train, y_train)
- plt.plot(xx, yy)
- plt.show()
-
- """使用更高次的多项式回归产生一个过拟合的结果"""
- # 建立二次多项式线性回归模型进行预测
- poly5 = PolynomialFeatures(degree=5) # 5次多项式特征生成器
- x_train_poly5 = poly5.fit_transform(x_train)
- # 建立模型预测
- linear5_poly5 = LinearRegression()
- linear5_poly5.fit(x_train_poly5, y_train)
- print('未经过岭回归时的各项特征的权重', linear5_poly5.coef_)
-
- # 绘制基于多项式回归后得出来的拟合曲线 + 散点图
- xx_poly5 = poly5.transform(xx)
- yy_poly5 = linear5_poly5.predict(xx_poly5)
- plt.scatter(x_train, y_train)
- plt.plot(xx, yy, label="Degree = 1")
- plt.plot(xx, yy_poly5, label="Degree = 5")
- plt.legend()
- plt.show()
-
- """使用Ridge岭回归解决出现的过拟合问题"""
- # 建立二次多项式线性回归模型进行预测
- poly5 = PolynomialFeatures(degree=5) # 5次多项式特征生成器
- x_train_poly5 = poly5.fit_transform(x_train)
- # 建立模型预测
- linear5_poly5_new = Ridge(alpha=0.8)
- linear5_poly5_new.fit(x_train_poly5, y_train)
- print('经过岭回归后的各项特征的权重', linear5_poly5.coef_)
-
- # 绘制基于多项式回归后得出来的拟合曲线 + 散点图
- xx_poly5 = poly5.transform(xx)
- yy_poly5 = linear5_poly5_new.predict(xx_poly5)
- plt.scatter(x_train, y_train)
- plt.plot(xx, yy, label="Degree = 1")
- plt.plot(xx, yy_poly5, label="Degree = 5")
- plt.legend()
- plt.show()
结果演示:
1、使用未经过多项式回归的样本数据,进行训练后的拟合结果(可见有些欠拟合,蓝色线为线性回归的结果,散点为各个样本数据。)
2、过拟合结果(蓝色线为未做任何处理后的线性回归的结果,黄色对样本数据由于做了过高次的多项式回归而产生的过拟合结果,散点为各个样本数据。可见黄线为了能更多地穿过散点,有些许过拟合了。)
3、对过拟合情况进行岭回归处理,可以看出已经减少了过拟合的程度(蓝色线为未做任何处理后的线性回归的结果,黄色线为对过拟合数据做了相应的岭回归后的线性回归的结果,散点为各个样本数据。可见过拟合程度有所减轻。)
参考文献:
【精选】机器学习之欠拟合、过拟合详解(附实例和对应解决办法)_过拟合 demo-CSDN博客
混淆矩阵也称为误差矩阵,用于对分类模型的性能进行评估的一种方法。混淆矩阵展示了在分类任务中的预测结果与实际标签之间的对应关系。下面是一个混淆矩阵的模板:
真实/预测 | 真 | 假 |
---|---|---|
真 | TP | FN |
假 | FP | TN |
基本概念:
TP(True Positives):真正例,预测为正例且实际上也为正例;
FP(False Positives):假正例,预测为正例然而实际上却是负例;
FN(false Negatives):假负例,预测为负例然而实际上却是正例;
TN(True Negatives):真负例,预测为负例而且实际上也是负例。
准确度:正例和负例中预测正确数量占总数量的比例。
代码演示:
- from sklearn.metrics import accuracy_score
- y_pred = [0, 2, 1, 3]
- y_true = [0, 1, 2, 3]
- print(accuracy_score(y_true, y_pred)) # 0.5
- print(accuracy_score(y_true, y_pred, normalize=False)) # 2
- # normalize : 布尔值, 可选的(默认为True).
- # 如果为False,返回分类正确的样本数量,否则,返回正确分类的得分.
-
- def accuracy(y_pred,y_true):
- from sklearn.metrics import accuracy_score
- return accuracy_score(y_pred,y_true)
结果演示:
精确度也称为查准率,以预测结果为判断依据,预测为正例的样本中预测正确的比例。
代码演示:
- from sklearn.metrics import precision_score
-
- y_true = [0, 1, 2, 0, 1, 2]
- y_pred = [0, 2, 1, 0, 0, 1]
- print(precision_score(y_true, y_pred, average='macro')) # 0.2222222222222222
- print(precision_score(y_true, y_pred, average='micro')) # 0.3333333333333333
- print(precision_score(y_true, y_pred, average='weighted')) # 0.2222222222222222
- print(precision_score(y_true, y_pred, average=None)) # [0.66666667 0. 0.]
-
- def precision(y_true, y_pred):
- from sklearn.metrics import precision_score
- return precision_score(y_true, y_pred, average='micro')
结果演示:
召回率也称为查全率,以实际样本为判断依据,实际为正例的样本中,被预测正确的正例占总实际正例样本的比例。
代码演示:
- from sklearn.metrics import recall_score
-
- y_true = [0, 1, 2, 0, 1, 2]
- y_pred = [0, 2, 1, 0, 0, 1]
- print(recall_score(y_true, y_pred, average='macro')) # 0.3333333333333333
- print(recall_score(y_true, y_pred, average='micro')) # 0.3333333333333333
- print(recall_score(y_true, y_pred, average='weighted')) # 0.3333333333333333
- print(recall_score(y_true, y_pred, average=None)) # [1. 0. 0.]
- def recall():
- from sklearn.metrics import recall_score
- return recall_score(y_true, y_pred, average='macro')
结果演示:
综合反映Precision和Recall的结果,取值范围在0到1之间,取值越大越好。
代码演示:
- from sklearn.metrics import f1_score
-
- y_true = [0, 1, 2, 0, 1, 2]
- y_pred = [0, 2, 1, 0, 0, 1]
- print(f1_score(y_true, y_pred, average='macro')) # 0.26666666666666666
- print(f1_score(y_true, y_pred, average='micro')) # 0.3333333333333333
- print(f1_score(y_true, y_pred, average='weighted')) # 0.26666666666666666
- print(f1_score(y_true, y_pred, average=None)) # [0.8 0. 0. ]
- def f1_score():
- from sklearn.metrics import f1_score
- return f1_score(y_true, y_pred, average='micro')
结果演示:
P-R曲线用于评估二分类模型在不同阙值下的性能表现。其中P代表的是Precision(精准率),R代表的是Recall(召回率),以Recall为横坐标轴,能够被正确识别为正例的样本数与总的正例样本数之比;Precision为纵坐标轴,被正确识别为正例的样本数与所有被预测为正例的样本数之比。
以sklearn.datasets
中的乳腺癌数据集为例,这是一个二分类数据集,我们将在这个数据集上学习一个分类树模型并绘制该模型的P-R曲线:
代码演示:
- from sklearn.tree import DecisionTreeClassifier
- from sklearn.model_selection import train_test_split
- from sklearn.datasets import load_breast_cancer
- from sklearn.metrics import precision_score
- from sklearn.metrics import recall_score
- import matplotlib.pyplot as plt
- import numpy as np
-
- data = load_breast_cancer()
- X = data.data
- y = data.target
-
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=66)
-
- dtc = DecisionTreeClassifier(min_samples_leaf=10)
- dtc.fit(X_train, y_train)
-
- # predict_proba返回的是每个样本分别属于两个类别的概率,而我们只关心它属于正类的概率
- probs = dtc.predict_proba(X_test)[:, 1]
-
- # 就像在上面那个虚构的例子中展示的那样,
- # 决策树在做预测时对每个样本会算出它属于两个类别的概率,
- # 最终预测结果就是预测概率大于0.5的那个类
- y_predict = dtc.predict(X_test)
-
- # 人为地生成一系列不同的阈值
- thresholds = np.arange(np.min(probs), np.max(probs), 0.1)
-
- precisions = []
- recalls = []
- for threshold in thresholds:
- y_predict = np.array(probs >= threshold, dtype='int')
- pre = precision_score(y_test, y_predict)
- recall = recall_score(y_test, y_predict)
- precisions.append(pre)
- recalls.append(recall)
-
- plt.plot(recalls, precisions)
- plt.xlabel('Recall')
- plt.ylabel('Precision')
- plt.show()
结果演示:
Sklearn已经封装了绘制P-R曲线的函数,使用时只要导sklearn.metrics.precision_recall_curve
就可以了。
还是以sklearn.datasets
中的乳腺癌数据集为例,在这个数据集上建立一个逻辑回归模型,并绘制该模型的P-R曲线:
- from sklearn.metrics import precision_recall_curve
- from sklearn.linear_model import LogisticRegression
- from sklearn.model_selection import train_test_split
- from sklearn.datasets import load_breast_cancer
- import matplotlib.pyplot as plt
-
- data = load_breast_cancer()
- X = data.data
- y = data.target
-
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=66)
-
- model = LogisticRegression(solver='liblinear')
- model.fit(X_train, y_train)
- scores = model.decision_function(X_test)
-
- precisions, recalls, thresholds = precision_recall_curve(y_test, scores)
-
- plt.plot(precisions, recalls)
- plt.xlabel('Recall')
- plt.ylabel('Precision')
- plt.show()
结果演示:
ROC(Reciver Operating Characteristic)又称为接收者操作特征曲线,AUC(Area under the Curre)为接收者操作特征曲线下的面积。ROC 曲线是基于混淆矩阵得出的。AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
ROC曲线是一种二分类模型的常用性能评估工具,它的横坐标是假阳率(False Positive Rate,FPR),纵坐标是真阳率(True Positive Rate,TPR,也称为召回率或灵敏度),ROC曲线展示了在不同阈值下模型的性能表现。
AUC指标是ROC曲线下的面积,其值在0.5到1之间,越接近1表示模型性能越好。当AUC=0.5时,表示模型的分类效果等同于随机猜测;当AUC=1时,表示模型可以完美地区分正类和负类样本。
机器学习的模型评估能够帮助我们判断模型的优劣、调整模型参数,但是模型评估是一个非常复杂和耗时的过程,需要综合考虑多方面的因素。结合具体的问题选择合适的方法和指标,不断的调整和优化模型来提高性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。