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)
模型评估指标:
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)