版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验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.metricsimportconfusion_matrix,classification_report,ConfusionMatrixDisplaydefevaluate_model(y_true,y_pred,model_name):print(f"---{model_name}评估报告---")print(classification_report(y_true,y_pred,target_names=['未流失','流失']))#绘制混淆矩阵cm=confusion_matrix(y_true,y_pred)disp=ConfusionMatrixDisplay(confusion_matrix=cm,display_labels=['未流失','流失'])disp.plot(cmap='Blues')plt.title(f"{model_name}混淆矩阵")plt.show()#评估KNNevaluate_model(y_test,y_pred_knn,"KNN")#评估决策树evaluate_model(y_test,y_pred_dt,"决策树")五、实验总结请根据代码运行结果回答以下问题:对比分析:在本实验数据集中,KNN和决策树哪个模型的准确率更高?在“召回率(Recall)”这一指标上,哪个模型对“流失用户”(类别1)的识别能力更强?特征敏感性:为什么我们在使用KNN之前必须对数据进行标准化(Standardization),而决策树可以不进行此步骤?业务思考:结合教材,如果银行更看重“不漏掉任何一个潜在流失客户”,你认为应该优先参考哪个评估指标(准确率、精确率还是召回率)?六、实验扩展(选做)参数调优:尝试修改KNN中的n_neighbors参数(例如设置为3,7,9),观察模型准确率的变化,寻找最优的K值。新模型尝试:尝试使用教材3.3节介绍的朴素贝叶斯(GaussianNB)或3.5节的支持向量机(SVM)对同一份数据进行建模,并对比其效果。ROC曲线:参考教材3.6.2节,尝试绘制上述模型的ROC曲线,并计算AUC值。备注:实验代码中的中文字体在某些环境下可能需要单独设置(如plt.rcParams['font.sans-serif']=['SimHei'])以避免乱码。数据是随机生成的,每次运行的具体指标数值可能会有细微差异。实验4-1:简单线性回归与相关性分析1.实验描述这是回归分析的入门实验。我们将使用教材中提到的经典“广告支出与销售额”场景。假设企业只在一种渠道(如电视广告)投入资金,我们需要探究广告投入金额与最终销售额之间是否存在线性关系。如果存在,我们希望能画出这条拟合直线,并计算出“每增加1万元广告费,销售额预计增加多少”。2.实验目的理解自变量(X)与因变量(y)的概念。掌握LinearRegression模型的基本调用方法。学会解读回归模型的截距(Intercept)和斜率(Coefficient)。掌握决定系数($R^2$)的含义。3.实验步骤与代码Pythonimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportr2_score#步骤1:准备模拟数据#假设X为电视广告投入(万元),y为销售额(万元)np.random.seed(42)X=10*np.random.rand(50,1)#0到10万元之间的随机投入y=3*X+5+np.random.randn(50,1)*2#真实关系:y=3x+5+噪声#步骤2:数据可视化plt.figure(figsize=(8,5))plt.scatter(X,y,color='blue',label='实际数据')plt.xlabel("电视广告投入(万元)")plt.ylabel("销售额(万元)")plt.title("广告投入vs销售额")#步骤3:构建并训练线性回归模型model=LinearRegression()model.fit(X,y)#步骤4:获取模型参数intercept=ercept_[0]#截距slope=model.coef_[0][0]#斜率print(f"回归方程:y={slope:.2f}*x+{intercept:.2f}")print(f"解释:当广告投入为0时,基础销售额为{intercept:.2f}万元;")print(f"每增加1万元广告投入,销售额平均增加{slope:.2f}万元。")#步骤5:绘制拟合直线X_fit=np.linspace(0,10,100).reshape(-1,1)y_fit=model.predict(X_fit)plt.plot(X_fit,y_fit,color='red',linewidth=2,label='拟合直线')plt.legend()plt.show()#步骤6:模型评估y_pred=model.predict(X)r2=r2_score(y,y_pred)print(f"模型决定系数R^2:{r2:.4f}(表示模型解释了{r2*100:.2f}%的数据波动)")4.实验总结通过本实验,我们应能直观看到“最小二乘法”是如何找到一条直线穿过数据点的。如果较高(接近1),说明线性模型能很好地解释数据。
实验4-2:多项式回归与非线性关系捕捉1.实验描述在现实商业中,变量关系往往不是直线的。例如,教材4.4节提到的“边际收益递减”现象:随着价格降低,销量增加,但降到一定程度后销量增长变缓;或者随着员工加班时间增加,效率先升后降。本实验将模拟一个非线性的“U型”或“倒U型”数据分布,对比线性回归与多项式回归的效果,展示如何通过“升维”来解决非线性问题。2.实验目的理解线性模型在处理非线性数据时的局限性(欠拟合)。掌握PolynomialFeatures的使用方法,理解特征构造的过程。观察多项式阶数(Degree)过高导致的过拟合现象。3.实验步骤与代码Pythonfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.pipelineimportmake_pipeline#步骤1:生成非线性数据(模拟员工工作时长vs效率,呈倒U型)np.random.seed(0)X=2+3*np.random.rand(50,1)#工作时长2-5小时y=5-(X-3.5)**2+np.random.randn(50,1)*0.1#3.5小时效率最高plt.figure(figsize=(10,6))plt.scatter(X,y,color='black',label='实际数据')#步骤2:尝试线性回归(Degree=1)model_linear=LinearRegression()model_linear.fit(X,y)X_seq=np.linspace(2,5,100).reshape(-1,1)plt.plot(X_seq,model_linear.predict(X_seq),color='red',linestyle='--',label='线性回归(欠拟合)')#步骤3:尝试多项式回归(Degree=2)-正确的模型#使用Pipeline简化流程:先特征变换,再回归model_poly2=make_pipeline(PolynomialFeatures(degree=2),LinearRegression())model_poly2.fit(X,y)plt.plot(X_seq,model_poly2.predict(X_seq),color='green',linewidth=2,label='2阶多项式(拟合良好)')#步骤4:尝试高阶多项式(Degree=15)-过拟合model_poly15=make_pipeline(PolynomialFeatures(degree=15),LinearRegression())model_poly15.fit(X,y)plt.plot(X_seq,model_poly15.predict(X_seq),color='blue',alpha=0.5,label='15阶多项式(过拟合)')plt.xlabel("连续工作时长(小时)")plt.ylabel("工作效率指数")plt.title("线性vs多项式回归对比")plt.legend()plt.ylim(2,6)plt.show()4.实验总结线性模型无法捕捉曲线趋势,产生较大误差。2阶多项式完美拟合了数据的抛物线形态。15阶多项式虽然穿过了更多数据点,但曲线剧烈震荡,失去了预测未来的能力(过拟合)。这引出了下一个实验的主题:如何控制模型复杂度。
实验4-3:正则化回归(Ridge与Lasso)1.实验描述当特征非常多,或者特征之间存在高度相关(多重共线性)时,普通线性回归会变得不稳定。教材4.3节介绍了正则化技术。本实验将构建一个具有多重共线性的数据集(例如:房屋面积、房间数、窗户数...这些特征高度相关),对比普通线性回归、岭回归(Ridge)和Lasso回归的表现,特别是观察Lasso如何将不重要的特征系数压缩为0(特征选择)。2.实验目的理解过拟合在高维数据中的表现。掌握Ridge和Lasso的调用及参数alpha的作用。核心目标:验证Lasso回归的特征选择能力(稀疏性)。3.实验步骤与代码Pythonfromsklearn.linear_modelimportRidge,Lasso#步骤1:创建具有多重共线性的稀疏数据#样本量50,特征数20,但只有前3个特征真正影响结果np.random.seed(42)n_samples,n_features=50,20X=np.random.randn(n_samples,n_features)#真实系数:只有前3个特征有效,其余系数为0true_coef=np.zeros(n_features)true_coef[:3]=[10,-5,2]y=np.dot(X,true_coef)+np.random.randn(n_samples)#y=X*w+噪声#步骤2:训练三种模型lr=LinearRegression()ridge=Ridge(alpha=1.0)lasso=Lasso(alpha=0.1)lr.fit(X,y)ridge.fit(X,y)lasso.fit(X,y)#步骤3:对比系数print("---系数对比---")print(f"真实系数(前5个):{true_coef[:5]}")print(f"Linear(无正则):{lr.coef_[:5]}")print(f"Ridge(L2正则):{ridge.coef_[:5]}")print(f"Lasso(L1正则):{lasso.coef_[:5]}")#步骤4:可视化系数分布plt.figure(figsize=(10,6))plt.plot(true_coef,'o',label='真实系数',color='black',markersize=10)plt.plot(lr.coef_,'^',label='Linear回归',alpha=0.5)plt.plot(ridge.coef_,'s',label='Ridge回归',alpha=0.5)plt.plot(lasso.coef_,'x',label='Lasso回归',markersize=8,markeredgewidth=2)plt.xlabel("特征索引")plt.ylabel("系数数值")plt.title("不同回归模型的系数对比")plt.legend()plt.show()#检查Lasso是否将无效特征(索引3以后)的系数压缩为0n_zeros=np.sum(lasso.coef_==0)print(f"\nLasso模型将{n_zeros}个特征的系数压缩为0(实现了特征选择)。")4.实验总结普通线性回归的系数可能在无效特征上也有较大数值(噪声)。Ridge会把所有系数都压缩得比较小,但不会变成0。Lasso成功地将大部分无效特征的系数变成了0,仅保留了最重要的几个特征,这验证了教材中关于Lasso具备“特征选择”能力的描述。
实验4-4:【综合实验】门店销售额预测全流程实战1.实验描述这是本章的综合大实验。我们将模拟一个真实的连锁门店数据集,包含“门店面积”、“距市中心距离”、“促销力度”、“竞争对手数量”等多个特征。我们需要完成从数据探索、预处理、模型选择(线性vs决策树回归vs随机森林回归)到模型评估的全过程。2.实验目的综合运用回归分析知识解决实际商务问题。掌握RMSE(均方根误差)和MAE(平均绝对误差)等评估指标。对比线性模型与非线性模型(如随机森林)在复杂业务数据上的表现。3.实验步骤与代码Pythonimportpandasaspdimportseabornassnsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestRegressorfromsklearn.metricsimportmean_squared_error,mean_absolute_error#步骤1:构建模拟商务数据data={'门店面积':np.random.randint(50,500,1000),'客流量':np.random.randint(100,5000,1000),'促销力度':np.random.rand(1000),#0-1之间'竞争对手数':np.random.randint(0,5,1000),'距市中心距离':np.random.rand(1000)*20#km}df=pd.DataFrame(data)#构造复杂的销售额公式(含非线性关系和交互作用)#销售额=面积*系数+客流*系数+促销*系数-竞争对手*系数-距离的平方(非线性)df['销售额']=(0.5*df['门店面积']+0.8*df['客流量']+5000*df['促销力度']-300*df['竞争对手数']-10*(df['距市中心距离']**2)+#非线性项np.random.normal(0,1000,1000)#噪声)#步骤2:数据集划分X=df.drop('销售额',axis=1)y=df['销售额']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)#步骤3:多模型对比训练models={"线性回归":LinearRegression(),"岭回归":Ridge(),"随机森林回归":RandomForestRegressor(n_estimators=100,random_state=42)}results={}print("---模型评估结果---")forname,modelinmodels.items():model.fit(X_train,y_train)y_pred=model.predict(X_test)#评估指标rmse=np.sqrt(mean_squared_error(y_test,y_pred))mae=mean_absolute_error(y_test,y_pred)r2=r2_score(y_test,y_pred)results[name]=r2print(f"[{name}]RMSE:{rmse:.0f},MAE:{mae:.0f},R2:{r2:.4f}")#步骤4:特征重要性分析(仅针对随机森林)rf_model=models["随机森林回归"]importances=pd.Series(rf_model.feature_importances_,index=X.columns)importances.sort_values().plot(kind='barh',color='teal')plt.title("影响销售额的关键因素(随机森林)")plt.show()4.实验总结与思考对比分析:观察线性回归和随机森林哪个R2更高?(由于数据中包含了“距离的平方”这一非线性项,理论上随机森林或经过多项式处理的线性回归效果更好)。业务分析:查看特征重要性图表,回答哪个因素对销售额影响最大(是客流量还是促销力度?)。这对于指导门店运营策略有什么帮助?误差理解:如果RMSE是1000元,意味着我们的预测平均会偏差1000元左右,结合总销售额来看,这个误差是否可接受?实验5-1:K-Means算法原理与K值选择(手肘法)1.实验描述K-Means是最常用的聚类算法。本实验使用计算机生成的简单“团状”数据,模拟不同分布的样本。我们将直观地观察质心(Centroids)是如何移动的,并学习解决K-Means最头疼的问题:“到底分几类最合适?”(学习使用手肘法)。2.实验目的理解K-Means的迭代过程(计算质心->分配样本->更新质心)。掌握KMeans类的调用及cluster_centers_属性的含义。核心目标:掌握“手肘法(ElbowMethod)”,通过SSE(误差平方和)确定最佳的K值。3.实验步骤与代码Pythonimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromsklearn.datasetsimportmake_blobs#步骤1:生成模拟数据(4个明显的中心)#n_samples=300,centers=4,cluster_std=0.60X,y=make_blobs(n_samples=300,centers=4,cluster_std=0.60,random_state=0)plt.figure(figsize=(8,5))plt.scatter(X[:,0],X[:,1],s=50)plt.title("原始未标记数据")plt.show()#步骤2:尝试K=4进行聚类kmeans=KMeans(n_clusters=4,random_state=0)y_kmeans=kmeans.fit_predict(X)#可视化聚类结果与质心plt.figure(figsize=(8,5))#画样本点plt.scatter(X[:,0],X[:,1],c=y_kmeans,s=50,cmap='viridis')#画质心(红色大点)centers=kmeans.cluster_centers_plt.scatter(centers[:,0],centers[:,1],c='red',s=200,alpha=0.7,marker='X',label='质心')plt.title("K-Means聚类结果(K=4)")plt.legend()plt.show()#步骤3:寻找最佳K值(手肘法)sse=[]#误差平方和(SumofSquaredErrors)k_range=range(1,10)forkink_range:km=KMeans(n_clusters=k,random_state=0)km.fit(X)sse.append(km.inertia_)#inertia_就是SSE#绘制手肘图plt.figure(figsize=(8,5))plt.plot(k_range,sse,marker='o')plt.xlabel('K值(聚类数量)')plt.ylabel('SSE(误差平方和)')plt.title('手肘法寻找最佳K值')plt.annotate('肘部(最佳点)',xy=(4,sse[3]),xytext=(5,1000),arrowprops=dict(facecolor='black',shrink=0.05))plt.show()4.实验总结可视化:通过红色“X”标记,我们能清晰看到算法找到的中心点。手肘法:随着K增加,SSE会一直下降。但在K=4时,下降速度突然变缓(出现拐点/肘部),说明K=4是性价比最高的分类数量。
实验5-2:层次聚类与树状图(Dendrogram)1.实验描述层次聚类不需要预先指定K值,而是生成一个层级结构。本实验通过绘制“树状图”,让我们看到数据是如何一步步从“各自为战”合并成“一个大家族”的。这在分析分类层级关系(如生物分类、商品品类归属)时非常有用。2.实验目的理解层次聚类(凝聚型)的“自底向上”合并过程。学会使用scipy.cluster.hierarchy绘制树状图(Dendrogram)。学会根据树状图的高度(距离)来决定在哪里“剪断”,从而确定聚类数量。3.实验步骤与代码Pythonimportscipy.cluster.hierarchyasschfromsklearn.clusterimportAgglomerativeClustering#使用与上一个实验相同的数据X(只取前20个点以便观察树图细节)X_subset=X[:20]#步骤1:绘制树状图plt.figure(figsize=(10,7))plt.title("层次聚类树状图(Dendrogram)")plt.xlabel("样本索引")plt.ylabel("欧氏距离(合并阈值)")#method='ward'表示最小化簇内方差dendrogram=sch.dendrogram(sch.linkage(X_subset,method='ward'))plt.show()#步骤2:使用AgglomerativeClustering进行聚类#假设我们根据树图决定分4类hc=AgglomerativeClustering(n_clusters=4,affinity='euclidean',linkage='ward')y_hc=hc.fit_predict(X)print(f"前10个样本的聚类标签:{y_hc[:10]}")4.实验总结树状图的纵轴代表距离。垂直线越长,说明这两个(组)簇之间的差异越大。这种方法特别适合不需要明确K值,或者希望探索数据内部层级结构的场景。
实验5-3:K-Means的局限与DBSCAN密度聚类1.实验描述K-Means假设簇是凸形(球状)的,但在处理复杂形状(如月牙形、环形)时往往失效。DBSCAN基于密度,能发现任意形状的簇,还能识别噪声。本实验通过对比,展示不同算法的适用边界。2.实验目的验证K-Means在非球形数据上的失败。掌握DBSCAN算法的核心参数eps(邻域半径)和min_samples(最小样本数)。理解DBSCAN如何识别噪声点(Outliers)。3.实验步骤与代码Pythonfromsklearn.datasetsimportmake_moonsfromsklearn.clusterimportDBSCAN#步骤1:生成“双月形”非凸数据X_moon,_=make_moons(n_samples=300,noise=0.05,random_state=0)#步骤2:使用K-Means尝试聚类(预期失败)kmeans=KMeans(n_clusters=2,random_state=0)y_km=kmeans.fit_predict(X_moon)#步骤3:使用DBSCAN尝试聚类(预期成功)dbscan=DBSCAN(eps=0.3,min_samples=5)y_db=dbscan.fit_predict(X_moon)#步骤4:对比可视化fig,(ax1,ax2)=plt.subplots(1,2,figsize=(14,5))#K-Means结果ax1.scatter(X_moon[:,0],X_moon[:,1],c=y_km,cmap='viridis',s=50)ax1.set_title("K-Means聚类结果(失败)")#DBSCAN结果#噪声点标签为-1,显示为紫色或特殊颜色ax2.scatter(X_moon[:,0],X_moon[:,1],c=y_db,cmap='viridis',s=50)ax2.set_title("DBSCAN聚类结果(成功)")plt.show()4.实验总结K-Means强行用直线划分双月,导致分类错误。DBSCAN顺着数据的密度“爬行”,完美分离了两个月牙形状,证明了其在特定几何结构下的优越性。
实验5-4:【综合实验】商场客户细分与画像构建1.实验描述模拟一个购物中心的会员数据,包含“年收入”和“消费评分(1-100)”。我们需要扮演数据分析师,利用聚类算法将客户分为不同的群体(如“高富帅”、“潜力股”、“节俭党”等),并针对每一类客户提出营销建议。2.实验目的综合运用数据预处理、K-Means建模和可视化。核心目标:学会解释聚类结果。聚类只是手段,给每一类人打上业务标签(UserProfiling)才是目的。3.实验步骤与代码Pythonimportpandasaspdimportseabornassns#步骤1:构建模拟商务数据#模拟200个客户#特征:客户ID,性别,年龄,年收入(k$),消费评分(1-100)np.random.seed(42)data={'AnnualIncome(k$)':np.random.randint(15,130,200),'SpendingScore(1-100)':np.random.randint(1,100,200)}#人为制造一些明显的群组逻辑以便于教学演示#组1:低收入,低消费#组2:低收入,高消费#组3:高收入,低消费#组4:高收入,高消费#组5:中等收入,中等消费(大多数人)#(此处为了简化代码,直接使用随机数据,实际教学可用真实Mall_Customers数据集)df=pd.DataFrame(data)#取出用于聚类的特征X=df.values#步骤2:确定最佳K值(再次练习手肘法)wcss=[]foriinrange(1,11):kmeans=KMeans(n_clusters=i,init='k-means++',random_state=42)kmeans.fit(X)wcss.append(kmeans.inertia_)plt.plot(range(1,11),wcss)plt.title('手肘法')plt.xlabel('K值')plt.ylabel('WCSS')plt.show()#假设手肘图显示K=5最合适#步骤3:训练模型(K=5)kmeans=KMeans(n_clusters=5,init='k-means++',random_state=42)y_kmeans=kmeans.fit_predict(X)#将聚类结果添加入原始数据df['Cluster']=y_kmeans#步骤4:结果可视化与业务解读plt.figure(figsize=(10,6))sns.scatterplot(x='AnnualIncome(k$)',y='SpendingScore(1-100)',hue='Cluster',data=df,palette='deep',s=100)plt.title('客户细分群体(CustomerSegments)')plt.xlabel('年收入(k$)')plt.ylabel('消费评分(1-100)')plt.legend(title='群体ID')plt.show()#步骤5:打印各群体的统计特征print("---各群体特征均值---")print(df.groupby('Cluster').mean())4.实验总结与业务思考请根据上述散点图和统计表,尝试为5个群体命名并制定策略:群体A(高收入,高分):VIP客户。策略:推荐高端奢侈品,提供专属服务。群体B(低收入,高分):月光族/年轻狂热者。策略:促销折扣,分期付款服务。群体C(高收入,低分):理智型高净值/守财奴。策略:从实用性、品质感切入,尝试激活其购买力。群体D(低收入,低分):普通大众。策略:维持基本服务,发放通用优惠券。群体E(中等,中等):主力消费群。策略:会员积分制,增加粘性。实验扩展轮廓系数(SilhouetteScore):作为手肘法的补充,使用sklearn.metrics.silhouette_score评估聚类的分离度(ClusterSeparation)。分数越接近1效果越好。后续安排第六章(关联规则):将进入“啤酒与尿布”的世界,学习Apriori算法,挖掘商品间的隐性联系。实验6-1:关联规则核心指标的手工验证与计算1.实验描述关联规则的难点不在于代码,而在于对指标的理解。在运行算法前,我们先通过一个极简的“微型数据集”,让我们像计算机一样思考,手工(或辅助代码)计算指标,从而透彻理解“为什么{A}->{B}是一条强规则”。2.实验目的理解事务(Transaction)与项集(Itemset)的概念。深刻理解支持度(Support)、置信度(Confidence)和提升度(Lift)的计算公式与业务含义。验证“提升度>1”才是有效规则的关键。3.实验步骤与代码Pythonimportpandasaspd#步骤1:定义一个微型交易数据集(5笔订单)#1代表购买,0代表未购买data={'牛奶':[1,0,1,1,0],'面包':[1,1,1,1,0],'尿布':[0,0,1,1,1],'啤酒':[0,0,0,1,1]}df=pd.DataFrame(data,index=['订单1','订单2','订单3','订单4','订单5'])print("原始交易数据:")print(df)#步骤2:手工计算验证(以{牛奶}->{面包}为例)#规则含义:买了牛奶的人,通过也会买面包#计算总订单数n=len(df)#计算支持度(Support):同时包含牛奶和面包的订单比例#订单1,3,4同时包含->3笔support_milk_bread=3/nprint(f"\n[计算]支持度(牛奶->面包)=3/5={support_milk_bread}")#计算置信度(Confidence):在买牛奶的订单中,买面包的比例#买牛奶的订单:1,3,4(共3笔)->其中买了面包的:1,3,4(共3笔)confidence_milk_bread=3/3print(f"[计算]置信度(牛奶->面包)=3/3={confidence_milk_bread}")#计算提升度(Lift):置信度/面包的先验概率(总体支持度)#面包的总体支持度:订单1,2,3,4都有面包->4/5=0.8lift_milk_bread=confidence_milk_bread/(4/5)print(f"[计算]提升度(牛奶->面包)=1.0/0.8={lift_milk_bread}")#步骤3:业务解读print("\n---解读---")iflift_milk_bread>1:print("提升度>1,说明牛奶和面包是正相关(互补品),捆绑销售有效。")else:print("提升度<=1,说明两者无关或负相关。")4.实验总结我们应通过此过程明白:置信度高(比如100%)并不一定代表规则好,因为如果面包本身大家都会买(支持度很高),那么买了牛奶再买面包可能只是巧合。只有提升度>1,才能说明牛奶促进了面包的销售。
实验6-2:使用Apriori算法进行频繁项集挖掘1.实验描述当数据量变大时,穷举所有组合是不可能的。本实验引入经典的Apriori算法。我们将模拟一个小型超市的清单,学习如何使用mlxtend库将原始的“列表数据”转换为“独热编码(One-hot)”格式,并挖掘频繁项集。2.实验目的掌握mlxtend.preprocessing.TransactionEncoder进行数据预处理。掌握apriori函数的使用,理解min_support参数如何“剪枝”。3.实验步骤与代码注意:需先安装库pipinstallmlxtendPythonimportpandasaspdfrommlxtend.preprocessingimportTransactionEncoderfrommlxtend.frequent_patternsimportapriori#步骤1:准备原始清单数据(ListofLists)dataset=[['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],['牛奶','苹果','芸豆','鸡蛋'],['牛奶','独角兽','玉米','芸豆','酸奶'],['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']]#步骤2:数据预处理(转换为One-Hot编码矩阵)#Apriori只能处理0/1矩阵或布尔矩阵te=TransactionEncoder()te_ary=te.fit(dataset).transform(dataset)df=pd.DataFrame(te_ary,columns=te.columns_)print("One-Hot编码后的数据前5行:")print(df.head())#步骤3:挖掘频繁项集(FrequentItemsets)#设定最小支持度min_support=0.6(即至少在60%的订单中出现)frequent_itemsets=apriori(df,min_support=0.6,use_colnames=True)#添加一列'length'方便观察项集包含几个商品frequent_itemsets['length']=frequent_itemsets['itemsets'].apply(lambdax:len(x))print("\n挖掘到的频繁项集:")print(frequent_itemsets)4.实验总结观察结果,为什么有些组合(如{'牛奶','玉米'})没有出现在结果中?(因为它们的共同出现频率低于60%)。min_support是控制结果数量的第一道阀门,设置得太高会漏掉长尾商品,设置得太低会产生海量计算。
实验6-3:生成强关联规则与筛选1.实验描述有了频繁项集,我们就可以生成规则了。本实验重点在于“筛选”。在成百上千条规则中,如何找出真正有商业价值的规则?我们将学习利用min_threshold和metric参数进行过滤。2.实验目的掌握association_rules函数的使用。学会基于Lift(提升度)和Confidence(置信度)筛选规则。理解“前件(antecedents)”和“后件(consequents)”的关系。3.实验步骤与代码Pythonfrommlxtend.frequent_patternsimportassociation_rules#接上一个实验的frequent_itemsets#步骤1:生成关联规则#metric="confidence",min_threshold=0.7#含义:只保留置信度>=70%的规则rules=association_rules(frequent_itemsets,metric="confidence",min_threshold=0.7)#步骤2:筛选强规则#筛选条件:提升度>1.0(正相关)且置信度>0.8strong_rules=rules[(rules['lift']>1.0)&(rules['confidence']>0.8)]#整理列名以便展示cols=['antecedents','consequents','support','confidence','lift']print("---强关联规则(Top5)---")print(strong_rules[cols].sort_values(by='lift',ascending=False).head())#步骤3:具体规则解读#假设输出了一条规则:{洋葱,鸡蛋}->{芸豆}#解释:买了洋葱和鸡蛋的人,有极大概率也会买芸豆。4.实验总结为什么我们不仅看置信度,还要看提升度?观察antecedents列,如果前件包含多个商品(如{洋葱,鸡蛋}),说明这是基于组合购买行为的预测,比单一商品预测更精准。
实验6-4:【综合实验】超市购物篮分析实战1.实验描述综合运用本章知识,处理一个稍大的模拟零售数据集。重点在于模拟真实的分析流程:数据加载->探索->挖掘->可视化->业务决策。我们将尝试用散点图来展示规则的分布,找出那些“支持度虽然不高,但提升度极高”的隐秘爆款组合。2.实验目的完整演练关联规则挖掘流程。掌握关联规则的可视化分析方法。能够根据挖掘结果提出具体的促销策略(如:货架摆放、组合打折)。3.实验步骤与代码Pythonimportmatplotlib.pyplotaspltimportseabornassns#步骤1:构造更复杂的模拟数据(模拟1000笔交易)#为了演示,我们随机生成一些交易,但人为植入几条强规则importrandomdataset=[]items=['牛奶','面包','黄油','果酱','啤酒','尿布','可乐','
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医儿科护理的针灸疗法
- 【2026】春沪教版(新教材)小学美术一年级下册第3单元 向天宫进发《第4课 在天宫相会》教学设计
- 中医护理焦虑护理方法
- 多巴胺受体在免疫调节中的作用研究-洞察与解读
- 2026年西藏自治区公开遴选公务员考试(行政职业能力测验)综合练习题及答案
- 2026年物业管理师资格考试(物业管理基本制度与政策)题库及答案(建设部)(云南省)
- 2026年四川省内江事业单位公开选调工作人员考试(公共基础知识)模拟试题及答案
- 智能手术机器人在微创手术中的应用与优化-洞察与解读
- 大数据精准营销-第16篇-洞察与解读
- 基因编辑技术在改善饮食结构中的作用-洞察与解读
- 跟踪审计服务 投标方案(技术方案)
- 加利福尼亚批判性思维技能测试后测试卷班附有答案
- 2023年高考语文练习(上海)02 小说阅读训练 含解析
- 艾略特作品及个人简介课件
- 监理服务承诺书(共8篇)
- 电力配电线路施工PPT完整全套教学课件
- 先进树脂基复合材料
- Java基础入门第三版课后习题答案
- 波尔川藏骑行攻略整理版2023年10月
- 凝血功能的监测与调控
- 2022年新《噪声污染防治法》修订解读
评论
0/150
提交评论