商务智能与数据分析 教案 第三章实验 K-近邻(KNN)算法的原理验证与参数分析_第1页
商务智能与数据分析 教案 第三章实验 K-近邻(KNN)算法的原理验证与参数分析_第2页
商务智能与数据分析 教案 第三章实验 K-近邻(KNN)算法的原理验证与参数分析_第3页
商务智能与数据分析 教案 第三章实验 K-近邻(KNN)算法的原理验证与参数分析_第4页
商务智能与数据分析 教案 第三章实验 K-近邻(KNN)算法的原理验证与参数分析_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验3-1:K-近邻(KNN)算法的原理验证与参数分析1.实验描述KNN是最直观的分类算法。本实验使用经典的“鸢尾花(Iris)”数据集或模拟的二维数据。我们将通过调整K值(邻居数量),直观地看到模型是如何在二维平面上划分“地盘”的,从而理解过拟合(K值过小)和欠拟合(K值过大)的概念。2.实验目的理解KNN算法“距离度量”和“多数表决”的核心思想。掌握KNeighborsClassifier的基本调用方法。核心目标:通过可视化观察K值变化对分类决策边界的影响。3.实验步骤与代码步骤1:加载数据并可视化为了方便可视化,我们只取鸢尾花数据集的前两个特征(花萼长度、花萼宽度)。Pythonimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportdatasetsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler#1.加载鸢尾花数据iris=datasets.load_iris()X=iris.data[:,:2]#只取前两个特征,方便画二维图y=iris.target#2.数据标准化(KNN对尺度敏感,必须做)scaler=StandardScaler()X_scaled=scaler.fit_transform(X)#3.划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X_scaled,y,test_size=0.3,random_state=42)#4.可视化原始数据分布plt.figure(figsize=(8,6))plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap='viridis',edgecolor='k',s=50)plt.xlabel('Feature1(Standardized)')plt.ylabel('Feature2(Standardized)')plt.title('IrisDataDistribution(2Features)')plt.show()步骤2:构建KNN模型并对比不同K值我们编写一个简单的函数来画出分类边界,直观对比K=1,K=5,K=15的效果。Pythonfromsklearn.neighborsimportKNeighborsClassifierfrommatplotlib.colorsimportListedColormapdefplot_decision_boundary(k,X_train,y_train):#训练模型clf=KNeighborsClassifier(n_neighbors=k)clf.fit(X_train,y_train)#创建网格来绘制背景颜色x_min,x_max=X_train[:,0].min()-1,X_train[:,0].max()+1y_min,y_max=X_train[:,1].min()-1,X_train[:,1].max()+1xx,yy=np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))#预测网格中每个点的类别Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)#绘图cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])plt.figure(figsize=(8,6))plt.pcolormesh(xx,yy,Z,cmap=cmap_light,shading='auto')plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap='viridis',edgecolor='k',s=30)plt.title(f"KNNDecisionBoundary(K={k})")plt.show()#分别观察K=1,K=5,K=50的效果plot_decision_boundary(k=1,X_train=X_train,y_train=y_train)plot_decision_boundary(k=5,X_train=X_train,y_train=y_train)plot_decision_boundary(k=50,X_train=X_train,y_train=y_train)4.实验总结K=1时:决策边界非常破碎、复杂,试图包围每一个训练样本。这是典型的过拟合表现,模型对噪声太敏感。K=50时:决策边界变得非常平滑,甚至可能是一条直线。这是欠拟合的表现,模型忽略了数据的局部细节。K=5时:通常能取得较好的平衡,边界既清晰又不过分复杂。5.实验扩展尝试将距离度量参数metric从默认的'minkowski'改为'manhattan'或'chebyshev',观察决策边界形状的变化。

实验3-2:朴素贝叶斯算法在文本分类中的应用1.实验描述朴素贝叶斯因其计算速度快,常用于文本分类。本实验模拟一个简单的“垃圾短信识别”场景。我们将把文本数据转化为数字向量(词袋模型),然后使用多项式朴素贝叶斯进行分类。2.实验目的理解计算机如何处理文本数据(词频统计)。掌握MultinomialNB(多项式朴素贝叶斯)的使用。验证朴素贝叶斯在小样本、高维特征下的有效性。3.实验步骤与代码步骤1:准备模拟数据与文本向量化Pythonfromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.naive_bayesimportMultinomialNB#1.模拟数据集(样本很少,方便理解)#1代表垃圾短信(Spam),0代表正常短信(Ham)corpus=['Winafreelotteryticketnow',#Spam'Meetingat3pmtomorrow',#Ham'Freemoneyandexclusiveoffer',#Spam'Canwehavelunchtogether?',#Ham'Limitedtimeofferforfreeprize',#Spam'Pleasecallmebacklater'#Ham]labels=[1,0,1,0,1,0]#2.文本向量化(词袋模型)#将文本转换为词频矩阵,每一列代表一个单词,每一行代表一句话vectorizer=CountVectorizer()X=vectorizer.fit_transform(corpus)#查看词表print("词汇表:",vectorizer.get_feature_names_out())print("词频矩阵:\n",X.toarray())步骤2:模型训练与新数据预测Python#3.训练多项式朴素贝叶斯模型nb_model=MultinomialNB()nb_model.fit(X,labels)#4.测试新数据new_messages=['Getfreemoneynow',#看起来像垃圾短信'Callmeforlunch'#看起来像正常短信]X_new=vectorizer.transform(new_messages)#注意:测试数据只能transform,不能fitpredictions=nb_model.predict(X_new)formsg,labelinzip(new_messages,predictions):result="垃圾短信"iflabel==1else"正常短信"print(f"短信内容:'{msg}'->预测结果:{result}")4.实验总结朴素贝叶斯通过统计“Free”、“Money”等词在垃圾短信中出现的概率,迅速判断新短信的类别。即使数据量很小,它也能根据关键词概率做出较为合理的判断。

实验3-3:决策树的构建与可视化解析1.实验描述决策树的优势在于“白盒”特性,即规则清晰可见。本实验使用教材中提到的“银行贷款审批”概念,构建一个包含模拟数据的决策树,并将其画出来,让我们亲眼看到“树”的生长过程。2.实验目的掌握DecisionTreeClassifier的使用。核心目标:学会使用plot_tree可视化决策树,并能根据生成的树状图读出具体的业务规则(如“若收入>X且有房=True,则批准”)。理解max_depth对防止过拟合的作用。3.实验步骤与代码步骤1:生成模拟贷款数据Pythonimportpandasaspdfromsklearn.treeimportDecisionTreeClassifier,plot_treeimportmatplotlib.pyplotasplt#1.创建模拟数据集data={'年龄':[25,35,45,20,55,30,40,22],'月收入(k)':[5,20,30,3,15,12,8,4],'有房':[0,1,1,0,1,0,1,0],#0:无,1:有'信用记录':[0,1,1,0,1,1,0,0],#0:一般,1:好'批准贷款':[0,1,1,0,1,1,1,0]#0:拒绝,1:批准}df=pd.DataFrame(data)X=df.drop('批准贷款',axis=1)y=df['批准贷款']print(df)步骤2:训练并可视化决策树Python#2.训练决策树模型#max_depth=3限制树的深度,方便展示dt_model=DecisionTreeClassifier(criterion='entropy',max_depth=3,random_state=42)dt_model.fit(X,y)#3.可视化决策树plt.figure(figsize=(12,8))plot_tree(dt_model,feature_names=X.columns,class_names=['拒绝','批准'],filled=True,rounded=True)plt.title("贷款审批决策树")plt.show()步骤3:输出特征重要性Python#查看哪个特征最重要importance=pd.Series(dt_model.feature_importances_,index=X.columns)print("特征重要性:")print(importance.sort_values(ascending=False))4.实验总结观察生成的树图,你会发现根节点通常是区分度最大的特征(例如“有房”或“收入”)。特征重要性告诉我们,在模型的判断逻辑中,哪些因素起到了决定性作用。

实验3-4:支持向量机(SVM)的核函数魔法1.实验描述SVM的强大之处在于处理非线性数据。本实验将生成两组数据:一组线性可分,一组呈“同心圆”分布(非线性)。我们将对比使用线性核(LinearKernel)和高斯核(RBFKernel)的区别,直观感受“核函数”如何解决复杂分类问题。2.实验目的对比LinearSVM和KernelSVM的适用场景。理解参数C(惩罚系数)对决策边界的影响。3.实验步骤与代码步骤1:生成非线性数据(同心圆)Pythonfromsklearn.datasetsimportmake_circlesfromsklearn.svmimportSVC#1.生成同心圆数据(非线性可分)X,y=make_circles(n_samples=300,factor=0.5,noise=0.1,random_state=42)plt.figure(figsize=(6,6))plt.scatter(X[:,0],X[:,1],c=y,cmap='coolwarm',edgecolor='k')plt.title("Non-linearData(Circles)")plt.show()步骤2:对比线性核与RBF核的效果Pythondefplot_svm_boundary(kernel_type,X,y,title):#训练SVMmodel=SVC(kernel=kernel_type,C=1.0)model.fit(X,y)#绘图背景x_min,x_max=X[:,0].min()-0.5,X[:,0].max()+0.5y_min,y_max=X[:,1].min()-0.5,X[:,1].max()+0.5xx,yy=np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))Z=model.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)plt.figure(figsize=(6,6))plt.contourf(xx,yy,Z,cmap='coolwarm',alpha=0.3)plt.scatter(X[:,0],X[:,1],c=y,cmap='coolwarm',edgecolor='k')plt.title(title)plt.show()#尝试线性核(Linear)-预期会失败plot_svm_boundary('linear',X,y,"SVMwithLinearKernel(Failed)")#尝试高斯核(RBF)-预期会成功plot_svm_boundary('rbf',X,y,"SVMwithRBFKernel(Success)")4.实验总结线性核试图用一条直线切分同心圆,显然无法做到,分类效果极差。RBF核能够生成封闭的曲线边界,完美将内圈和外圈分开。这验证了SVM在处理非线性复杂业务数据时的优势。

实验3-5:基于分类算法的客户流失预测与模型评估一、实验背景与描述在当今商业环境中,客户流失是企业面临的重大挑战之一。根据教材第三章所述,分类算法在商务智能中有着广泛的应用,其中“客户流失预测”是典型的二分类问题。通过分析客户的历史行为数据(如消费金额、投诉次数、活跃度等),构建分类模型来预测客户是否可能流失,可以帮助企业提前采取挽留措施,降低运营风险。本实验将引导我们使用Python的scikit-learn机器学习库,完成从数据准备、数据预处理、模型构建(KNN与决策树)到模型评估的全流程。我们将通过实际代码操作,深入理解分类算法的工作原理及其在商务决策中的价值。二、实验目的理解分类问题:加深对分类问题定义、特征及二分类任务的理解。掌握算法实现:熟练使用Python实现教材中介绍的K-近邻(KNN)和决策树(DecisionTree)算法。掌握数据预处理:学会对分类任务进行必要的数据预处理,如特征标准化(针对KNN)和数据集划分。掌握模型评估:学会使用混淆矩阵、准确率、召回率、F1分数等指标评估分类模型的性能。三、实验环境编程语言:Python3.x开发工具:JupyterNotebook/PyCharm/VSCode必要库:numpy,pandas,matplotlib,seaborn,scikit-learn四、实验步骤步骤1:生成与探索模拟数据为了方便实验进行,我们首先构建一个模拟的客户数据集,包含年龄、月消费金额、投诉次数等特征。Pythonimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassns#设置随机种子以保证结果可复现np.random.seed(42)#1.生成模拟数据(样本量:500)n_samples=500data={'年龄':np.random.randint(18,70,n_samples),'月消费金额':np.random.normal(500,150,n_samples),#均值500,标准差150'投诉次数':np.random.randint(0,5,n_samples),'在网时长(月)':np.random.randint(1,60,n_samples),'是否流失':np.random.choice([0,1],n_samples,p=[0.7,0.3])#0:未流失,1:流失}#调整数据逻辑:投诉多、消费低、在网短的更容易流失(增加数据的规律性)df=pd.DataFrame(data)df.loc[(df['投诉次数']>2)&(df['月消费金额']<400),'是否流失']=1df.loc[(df['投诉次数']==0)&(df['月消费金额']>600),'是否流失']=0print("数据预览:")print(df.head())#2.查看数据分布(简单的EDA)print("\n数据统计描述:")print(df.describe())print("\n流失类别分布:")print(df['是否流失'].value_counts())步骤2:数据预处理根据教材3.2节所述,KNN算法基于距离度量,对特征尺度非常敏感,因此必须进行标准化处理。Pythonfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler#1.划分特征变量(X)和目标变量(y)X=df.drop('是否流失',axis=1)y=df['是否流失']#2.划分训练集和测试集(80%训练,20%测试)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)#3.特征标准化(Z-Score标准化)#注意:必须用训练集的参数来标准化测试集,防止数据泄露scaler=StandardScaler()X_train_scaled=scaler.fit_transform(X_train)X_test_scaled=scaler.transform(X_test)print(f"训练集样本数:{X_train.shape[0]},测试集样本数:{X_test.shape[0]}")print("标准化后的前5行训练数据:\n",X_train_scaled[:5])步骤3:构建K-近邻(KNN)分类模型实现教材3.2节的KNN算法,并观察不同K值下的表现。Pythonfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.metricsimportaccuracy_score#1.初始化KNN模型(这里设定K=5)knn_model=KNeighborsClassifier(n_neighbors=5)#2.训练模型knn_model.fit(X_train_scaled,y_train)#3.预测y_pred_knn=knn_model.predict(X_test_scaled)#4.基础评估acc_knn=accuracy_score(y_test,y_pred_knn)print(f"KNN模型(K=5)的测试集准确率:{acc_knn:.4f}")步骤4:构建决策树(DecisionTree)分类模型实现教材3.4节的决策树算法。决策树对特征缩放不敏感,可以直接使用原始数据,但为了对比方便,这里同样使用预处理后的数据(结果不受影响)。Pythonfromsklearn.treeimportDecisionTreeClassifierfromsklearn.treeimportplot_tree#1.初始化决策树模型(使用基尼指数,控制最大深度防止过拟合)dt_model=DecisionTreeClassifier(criterion='gini',max_depth=4,random_state=42)#2.训练模型dt_model.fit(X_train,y_train)#决策树可以使用未标准化的X_train#3.预测y_pred_dt=dt_model.predict(X_test)#4.基础评估acc_dt=accuracy_score(y_test,y_pred_dt)print(f"决策树模型(max_depth=4)的测试集准确率:{acc_dt:.4f}")#5.可视化决策树规则(可选)plt.figure(figsize=(15,8))plot_tree(dt_model,feature_names=X.columns,class_names=['未流失','流失'],filled=True)plt.title("决策树模型可视化")plt.show()步骤5:模型评估与对比根据教材3.6节“分类模型评估”,使用混淆矩阵和分类报告进行详细评估。Pythonfromsklearn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论