机器学习之模型评估与优化

欠拟合和过拟合

产生原因:模型不合适导致其无法对数据实现有效的预测。

模型对数据的预测情况:

训练数据 预测数据
欠拟合 不准确 不准确
过拟合 准确 不准确
好模型 准确 准确

欠拟合可以通过观察训练数据及时发现,通过优化模型结果解决

过拟合产生原因

  • 模型结构过于复杂(维度过高)
  • 使用了过多属性,模型训练时包含了干扰信息

解决办法:

  • 简化模型结构(使用低阶模型,比如线性模型)
  • 数据预处理,保留主成分信息(数据PCA处理)
  • 在模型训练时,增加正则化项(regularization)

增加正则化项

机器学习之模型评估与优化_第1张图片
机器学习之模型评估与优化_第2张图片

数据分离与混淆矩阵

建立模型的意义,不在于对训练数据做出准确预测,更在于对新数据的准确预测

模型训练与评估流程

数据载入    —>    数据可视化与预处理    —>    模型创建    —>    数据用于模型训练    —>    模型评估

分类任务中,计算测试数据集预测准确率(accuracy)以评估模型表现。训练数据集准确率随着模型复杂而提高,测试数据集准确率在模型过于简单或过于复杂的情况时下降。但无法真实反映模型针对各个分类的预测准确度。准确率可以方便的用于衡量模型的整体预测效果,但无法反应细节信息,具体表现在:

  • 没有体现数据预测的实际分布情况(0、1本身的分布比例)
  • 没有体现模型错误预测的类型

混淆矩阵

混淆矩阵(Confusion Matrix),又称为误差矩阵,用于衡量分类算法的准确程度
机器学习之模型评估与优化_第3张图片
通过混淆矩阵,计算更丰富的模型评估指标
机器学习之模型评估与优化_第4张图片
混淆矩阵指标特点:

  • 分类任务中,相比单一的预测准确率,混淆矩阵提供了更全面的模型评估信息(TP\TN\FP\FN)
  • 通过混淆矩阵,可以计算出多样的模型表现衡量指标,更好选择模型

衡量指标选择关键取决于应用场景,例如垃圾邮件检测机制,需要判断垃圾邮件的样本(垃圾邮件为正样本)都是判断正确的,需要关注精确率;还需要所有垃圾邮件尽可能判断出来,需要关注召回率。例如异常交易检测,希望判断正常的交易中尽可能不存在异常交易,还需要加特异度。

模型优化

数据的重要性:数据质量决定模型表现的上限。

建立模型优化要素:

  • 数据属性的意义,是否为无关数据    —>    删除不必要的属性(PCA)    —>    减少过拟合、节约运算时间
  • 不同属性数据的数量级差异性如何    —>    数据预处理:归一化、标准化    —>    平衡数据影响,加快训练收敛
  • 是否有异常数据    —>    确定是否保留或过滤掉异常数据    —>    提高鲁棒性
  • 采集数据的方法是否合理,采集到的数据是否有代表性    —>    尝试不同的模型,对比模型表现    —>    帮助确定更合适的模型
  • 对于标签结果,要确保标签判定规则的一致性(统一标准)

确立模型类别后,优化要素(数据、模型核心参数、正则化):

  • 遍历核心参数组合,评估对应模型表现(逻辑回归边界考虑多项式、KNN尝试不同的n_neighbors值,复杂度由n_neighbors决定,n_neighbors值越小,模型复杂度越高)
  • 扩大数据样本
  • 增加或减少数据属性
  • 对数据进行降维处理
  • 对模型进行正则化处理,调整正则项λ的数值

代码实现

## 生成新数据并用于预测:
X_range = np.linspace(40,90,300).reshape(-1,1)
y_range_predict = lr1.predict(X_range)

## 生成多项式(二次)数据:
from sklearn.preprocessing import PolynomialFeatures
poly2 = PolynomialFeatures(degree = 2)
X_2_train = poly2.fit_transform(X_train)
X_2_test = poly2.transform(X_test)

##数据分离
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 4, test_size = 0.4)

##生辰决策区域数据
xx,yy = np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05))
x_range = np.c_[XX.ravel(),yy.ravel()]
y_range_predict = knn.predict(x_range)

##可视化决策树区域:
bad_knn = plt.scatter(x_range[:,0][y_range_predict == 0],x_range[:,1][y_range_predict == 0])
good_knn = plt.scatter(x_range[:,0][y_range_predict == 1],x_range[:,1][y_range_predict == 1])

##计算混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_test_predict)
TP = cm[1,1]
TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]

##计算召回率、特异度、精确率、F1分数
recall = TP/(TP + FN)
specificity = TN/(TN + FP)
precision = TP/(TP + FP)
f1 = 2*precision*recall/(precision + recall)

你可能感兴趣的:(machineLearning,机器学习,人工智能,数据分析,python,深度学习)