1.过拟合与欠拟合

欠拟合与过拟合:

 

训练数据

预测数据

欠拟合

不准确

不准确

过拟合

准确

不准确

好模型

准确

准确

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

如何解决过拟合问题:

  • 原因:模型结构过于复杂(维度过高);使用了过多属性,模型训练时包含了干扰项信息。
  • 解决办法:简化数据模型(使用低阶模型,如线性模型);数据PCA处理;模型训练时,增加正则化项

2.数据分离与混淆矩阵

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

模型训练与评估流程:数据载入----->数据可视化与预处理---->模型创建---->全数据用于模型训练---->模型评估

没有新数据用于评估模型怎么办?:对全数据进行分离,部分用于训练,部分用于新数据的结果预测。

  • 把数据分成两部分:训练集,测试集
  • 用训练集进行模型训练
  • 用数据集进行数据预测,更有效地评估模型对于新数据的预测表现。

分类任务中,计算测试数据集预测准确率以评估模型表现。局限性:无法真实反映模型针对各个分类的预测准确度。

混淆矩阵:又称误差矩阵,用于衡量分类算法的准确程度。

 

预测结果

0

1

实际

结果

0

True Negative(TN)

     

False Positive(FN)

1

False Negative(FN)

True Positive(TP)

  • TP:预测准确,实际为正样本的数量(实际为1,预测为1) 
  • TN:预测准确,实际为负样本的数量(实际为0,预测为0) 
  • FP:预测错误,实际为负样本的数量(实际为0,预测为1) 
  • FN:预测错误,实际为正样本的数量(实际为1,预测为0) 

模型评估指标:

模型评价 gini python 模型评价与优化_多项式

3.模型优化

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

检查数据:

  • 数据属性的意义,是否为无关数据
  • 不同属性数据的数量级差异性如何
  • 是否有异常数据
  • 采集数据的方法是否合理,采集到的数据是否有代表性
  • 对于标签结果,要确保标签判定规则的一致性

处理数据:

  • 删除不必要的数据--->减少过拟合,节约运算时间
  • 数据预处理:归一化,标准化--->平衡数据影响,加快训练收敛
  • 确定是否保留或过滤掉异常数据--->提高鲁棒性
  • 尝试不同的模型,对比模型表现--->帮助确定更合适的模型

模型优化的目标:在确定模型类别后,如何让模型表现更好(数据,模型参数,正则化

尝试以下方法:

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

训练数据集准确率:随着模型复杂而提高

测试数据集准确率:在模型过于简单或过于复杂的情况时下降

4.实战准备

实战一:酶活性预测

  • 基于T-R-train.csv数据,建立线性回归模型,计算其在T-R-train.csv数据上的r2分布,可视化模型预测结果
  • 加入特征多项式(2次,5次),建立回归模型
  • 计算多项式回归模型对预测数据进行预测的r2分数,判断哪个模型预测更准确
  • 可视化多项式回归模型数据预测结果,判断哪个模型预测更准确
#生成新数据并用于预测
#(40,90,300):生成从40~90的300个数
#reshape(-1,1):生成300行1列的数据
X_range = np.linspace(40,90,300).reshape(-1,1)
y_range_predict = lr1.predict(X_range)

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

实战二:质量好坏预测

  • 基于data_class_raw.csv数据,根据高斯分布概率密度函数,寻找异常点并剔除。
  • 基于data_class_processed.csv数据,进行PCA处理,确定重要数据维度及成分。
  • 完成数据分离,数据分离参数:random_state = 4, test_size = 0.4。
  • 建立KNN模型完成分类,n_neighbors取10,计算分类准确率,可视化分类边界。
  • 计算测试数据集对应的混淆矩阵,计算准确率,召回率,特异度,精确率,F1参数。
  • 尝试不同的n_neighbors(1-20),计算其在训练数据集,测试数据集熵的准确率并作图。
#数据分离
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)