机器学习入门与Python实战(十一):模型优化、过拟合、欠拟合

目录

现实问题思考

回归问题

分类问题

欠拟合与过拟合

解决过拟合问题的方法

数据增强

数据PCA处理

增加正则项

知识巩固

模型优化:建立表现更好的模型!

机器学习核心流程与问题

数据质量决定模型表现的上限!

模型优化实例

先检查数据问题

多模型对比

单一模型的核心参数优化

提高模型表现的四要素

知识巩固

Python实战:芯片品质预测

拓展学习


现实问题思考

回归问题

根据收集到的部分炮弹发射数据,推测在x_d=400时,炮弹高度y_d

分类问题

欠拟合与过拟合

由于模型不合适,致使其无法对数据进行准确的预测。

解决过拟合问题的方法

原因:

  • 使用了过于复杂的模型结构(比如高阶决策边界)
  • 训练数据不足,有限的训练数据(训练样本只有总体样本中的小部分、不具备代表性)
  • 样本里的噪音数据干扰过大,模型学习到了噪音信息(使用过多与结果不相关属性数据)

解决办法:

  • 简化模型结构(降低模型复杂度,能达到好的效果情况下尽可能选择简单的模型
  • 数据增强(按照一定的规则扩充样本数据)
  • 数据预处理,保留主成分信息(数据PCA处理)
  • 增加正则化项(regularization

参考链接:https://blog.csdn.net/dfly_zx/article/details/107954860

数据增强

数据PCA处理

增加正则项

机器学习过程中,模型求解的核心目标就是最小化损失函数,增加正则项是指在损失函数中添加一个额外项,实现对求解参数的数值约束,防止模型过拟合。

思考:如果𝛌是很大的数值(比如1000000),将对损失函数、𝜃造成什么影响?

如果𝛌是很大的数值(比如1000000),那各个𝜃取值就不能过大,其意义则是各个属性数据的系数受到约束(有效控制各个属性数据的影响)。

参考链接:https://blog.csdn.net/dfly_zx/article/details/107957820

知识巩固

思考:在日常的机器学习建模任务中,数据会决定模型表现的上限,因此应该尽可能多收集数据,属性也越多越好,这样能达到更好的效果。这是正确的还是错误的,为什么?

模型优化:建立表现更好的模型!

机器学习核心流程与问题

三大核心问题:

  • 选用什么算法?
  • 核心结构、参数如何设置?
  • 模型表现不好,怎么办?

数据质量决定模型表现的上限!

上游决定下游,建模前五检查

1、样本代表性:采集数据的方法是否合理,采集到的数据是否有代表性

2、标签统一化:对于样本结果,要确保每个样本都遵循一样的标签规则

3、数据合理性:样本中的异常数据点是否合理、如何处理

4、数据重要性:数据属性的意义,是否为无关数据

5、属性差异性:不同属性数据的数量级差异性如何

尝试以下方法:

1、根据实际场景扩充或减少样本

2、对不合理标签数据进行预处理

3、删除不重要的属性数据、数据降维

4、对数据进行归一化或标准化

5、过滤掉异常数据

好处:

1、数据质量提升,有助于提高模型表现

2、帮助模型学习到正确信息(合理的“监督”)

3、降低噪声影响、减少过拟合、节约运算时间

4、平衡数据影响,加快训练收敛

5、降低噪声影响、提高鲁棒性

模型优化实例

根据芯片尺寸1、尺寸2参数识别次品

先检查数据问题

  1. 是否有异常数据点、对其是否要保留或删除?
  2. 不同属性数据量级差异如何
  3. 是否有不重要的属性、是否需要降低数据维度 ?

接下来检查算法选的是否合适、核心结构与参数是否合理

模型对比

尝试不同的模型,对比模型表现

单一模型的核心参数优化

KNN模型,可以尝试不同的K

提高模型表现的四要素

知识巩固

问题:以下哪些方法可能有助于提高模型表现,思考其具体的帮助?

A. 收集更多的样本数据

B. 对数据进行降维处理

C. 尝试不同的模型

D. 在模型损失函数计算中,增加正则项

E. 尝试调整模型的核心参数

F. 对计算机的配置进行升级


 

Python实战:芯片品质预测

基础环境: Python语言;安装核心工具包numpy、pandas、sklearn、matplotlib;环境管理软件Anaconda;Jupyter notebook

环境配置参考:机器学习入门与Python实战核心工具篇:pip源、python、anaconda、工具包(完整版)https://blog.csdn.net/dfly_zx/article/details/110188923

任务:基于task2_data数据,综合异常数据检测、PCA降维、数据分离、KNN等技术完成芯片品质预测。

1、基于高斯分布概率密度函数,对两个维度数据进行分析、计算概率密度函数,寻找异常点并剔除

2、统计分析各维度数据分布

3、对数据进行主成分分析,计算各维度方差比例

4、数据分离,数据分离参数:random_state=1,test_size=0.4

5、建立KNN模型(K=3)完成分类,可视化分类边界

6、计算测试数据集对应的混淆矩阵,准确率、召回率、特异度、精确率、F1分数

7、尝试不同的K值(1-20,计算其在训练数据集、测试数据集上的准确率并作图


#加载数据
import pandas as pd
import numpy as np
data = pd.read_csv('task2_data.csv')
data.head()

#X y赋值
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
X.head()

#数据可视化
from matplotlib import pyplot as plt
fig1 = plt.figure()
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0],marker='x',s=150,label='bad')
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1],marker='o',facecolor='none',edgecolor='red',s=150,label='good')
plt.title('chip data')
plt.xlabel('size 1')
plt.ylabel('size 2')
plt.legend()
plt.show()

import math
x1 = data.loc[:,'x1'][y==0]
x2 = data.loc[:,'x2'][y==0]
#计算均值与标准差
u1 = x1.mean()
sigma1 = x1.std()
u2 = x2.mean()
sigma2 = x2.std()
# print(u1,sigma1,u2,sigma2)
#计算高斯分布的概率密度函数
p1 = 1/sigma1/math.sqrt(2*math.pi)*np.exp(-np.power((x1-u1),2)/2/math.pow(sigma1,2))
p2 = 1/sigma2/math.sqrt(2*math.pi)*np.exp(-np.power((x2-u2),2)/2/math.pow(sigma2,2))
p = np.multiply(p1,p2)
print(p)
print('max p:',max(p))
print('min p:',min(p))
print('max/min:',max(p)/min(p))

import math
x1 = data.loc[:,'x1'][y==1]
x2 = data.loc[:,'x2'][y==1]
#计算均值与标准差
u1 = x1.mean()
sigma1 = x1.std()
u2 = x2.mean()
sigma2 = x2.std()
# print(u1,sigma1,u2,sigma2)
#计算高斯分布的概率密度函数
p1 = 1/sigma1/math.sqrt(2*math.pi)*np.exp(-np.power((x1-u1),2)/2/math.pow(sigma1,2))
p2 = 1/sigma2/math.sqrt(2*math.pi)*np.exp(-np.power((x2-u2),2)/2/math.pow(sigma2,2))
p = np.multiply(p1,p2)
print(p)
print('max p:',max(p))
print('min p:',min(p))
print('max/min:',max(p)/min(p))
#异常数据点对点检测
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope(contamination=0.02)
ad_model.fit(X[y==0])
y_predict_bad = ad_model.predict(X[y==0])
print(y_predict_bad)

fig2 = plt.figure()
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0],marker='x',s=150,label='bad')
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1],marker='o',facecolor='none',edgecolor='red',s=150,label='good')
plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='o',s=150)
plt.title('chip data')
plt.xlabel('size 1')
plt.ylabel('size 2')
plt.legend()
plt.show()

#剔除异常数据点
print(data.shape)
data = data.drop(index=35)
print(data.shape)

#各维度数据分布
fig3 = plt.figure()
plt.subplot(121)
plt.hist(x1,bins=10)
plt.title('x1 data')
plt.xlabel('x1')
plt.ylabel('counts')
plt.subplot(122)
plt.hist(x2,bins=10)
plt.title('x2 data')
plt.xlabel('x2')
plt.ylabel('counts')

plt.show()

#X y赋值
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
print(X.shape)

#主成分分析
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_norm = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X_norm)
var_ratio = pca.explained_variance_ratio_
print(var_ratio)
fig4 = plt.figure()
plt.bar([1,2],var_ratio)
plt.xticks([1,2],['PC1','PC2'])
plt.show()

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

#建立knn模型 k=3
from sklearn.neighbors import KNeighborsClassifier
knn_3 = KNeighborsClassifier(n_neighbors=3)
knn_3.fit(X_train,y_train)

#模型预测
y_train_predict = knn_3.predict(X_train)
y_test_predict = knn_3.predict(X_test)
print(y_train_predict,y_test_predict)

from sklearn.metrics import accuracy_score
accuracy_train = accuracy_score(y_train,y_train_predict)
accuracy_test = accuracy_score(y_test,y_test_predict)
print(accuracy_train,accuracy_test)

#结果可视化
#生成用于结果可视化的数据集
xx,yy = np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05))
#数据展开
x_range = np.c_[xx.ravel(),yy.ravel()]
print(x_range.shape)
print(x_range)

#预测生成的数据对应的类别
y_range_predict = knn_3.predict(x_range)
fig4 = plt.figure()

bad_p = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0],label='bad_p')
good_p = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1],label='good_p')

bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0],marker='x',s=150,label='bad')
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1],marker='o',facecolor='none',edgecolor='red',s=150,label='good')


plt.title('chip data')
plt.xlabel('size 1')
plt.ylabel('size 2')
plt.legend()
plt.show()

#计算混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_test_predict)
print(cm)

#获取混淆矩阵元素
TP = cm[1,1]
TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]
print(TP,TN,FP,FN)

accuracy = (TP+TN)/(TP+TN+FP+FN)
print(accuracy)

recall = TP/(TP + FN)
print(recall)

specificity = TN/(TN + FP)
print(specificity)

precision = TP/(TP + FP)
print(precision)

f1 = 2*precision*recall/(precision+recall)
print(f1)

#尝试不同的k值并计算准确率
n = [i for i in range(1,21)]
accuracy_train = []
accuracy_test = []
for i in n:
    knn_i = KNeighborsClassifier(n_neighbors=i)
    knn_i.fit(X_train,y_train)
    y_train_predict = knn_i.predict(X_train)
    y_test_predict = knn_i.predict(X_test)
    accuracy_train_i = accuracy_score(y_train,y_train_predict)
    accuracy_test_i = accuracy_score(y_test,y_test_predict)
    accuracy_train.append(accuracy_train_i)
    accuracy_test.append(accuracy_test_i)
print(accuracy_train,accuracy_test)

#k值变化对准确率影响的结果可视化
fig10 = plt.figure(figsize=(12,5))
plt.subplot(121)
plt.plot(n,accuracy_train,marker='o')
plt.title('training data accuracy ')
plt.xlabel('k')
plt.ylabel('accuracy')

plt.subplot(122)
plt.plot(n,accuracy_test,marker='o')
plt.title('test data accuracy ')
plt.xlabel('k')
plt.ylabel('accuracy')
plt.show()

综合提升之芯片品质预测实战summary:

1、通过进行基于高斯分布概率密度函数的异常检测方法,帮助找到了潜在的异常数据点;
2、对各维度数据统计其数据分布后,发现各维度属性数据量级接近;
3、通过PCA分析,建议保留2维数据集、不进行数据降维操作;
4、实现了训练数据与测试数据的分离,并计算模型对于测试数据的预测准确率
5、计算得到混淆矩阵,实现模型更全面的评估
6、通过调整核心参数n_neighbors值,再计算对应的准确率,可以帮助我们更好的确定使用哪个模型

核心算法参考链接:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier


拓展学习

如果现在就想开始学习机器学习,你还可以:

1、添加微信:ai_flare,领取Python编程课(AI方向)、Python实现机器学习,免费领取(仅限前100名)

2、人工智能学习路线:专为AI小白设计的人工智能实战课 - Python3入门人工智能 基础+实战 学习视频教程-CSDN学院

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值