目录
现实问题思考
回归问题
根据收集到的部分炮弹发射数据,推测在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参数识别次品
先检查数据问题
- 是否有异常数据点、对其是否要保留或删除?
- 不同属性数据量级差异如何 ?
- 是否有不重要的属性、是否需要降低数据维度 ?
接下来检查算法选的是否合适、核心结构与参数是否合理
多模型对比
尝试不同的模型,对比模型表现
单一模型的核心参数优化
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学院