《数据挖掘与财务决策》习题及答案_第1页
《数据挖掘与财务决策》习题及答案_第2页
《数据挖掘与财务决策》习题及答案_第3页
《数据挖掘与财务决策》习题及答案_第4页
《数据挖掘与财务决策》习题及答案_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第一章概述1.什么是数据挖掘?数据挖掘(DataMining,DM),又称为数据库中的知识发现(KnowledgeDiscoverinDatabase,KDD),就是从大量不完整的、有噪声的、模糊的数据中,提取出隐含在其中、人们事先不知道的、但是潜在有用的或者有趣的信息或知识的过程。2.解释一下分类的概念。分类技术是数据挖掘中最常用的算法,是一种提取刻画重要数据类的模型,也是一种机器学习算法,又被称为监督学习(supervisedlearning),这一类方法通过从已有的经验数据中学习并发现规律对数据进行分类。分类算法对已知类别标签的数据进行训练和分析,从中发现分类的规则并对新的数据进行预测。分类是一个两阶段过程,包括学习阶段(构建分类模型)和分类阶段(使用模型预测给定数据的类标签)。3.聚类是什么事什么?聚类与分类的区别是什么?聚类分析简称聚类(clustering),是一个把给定的数据集划分为若干子集的过程,每一个子集是一个簇(cluster)。聚类后的同一簇中的数据对象彼此相似,但与其他簇中的数据不相似。聚类也被称作无监督学习(unsupervisedlearning),因为被聚类的数据集没有提供类标号信息,这也是其与分类技术最大的区别。4.离群点检测有什么作用?离群点与大多数数据的行为或模式不一致。大部分应用或者数据挖掘都是将离群点视为噪声或者异类将其丢弃,但在一些应用场景中,如各种入侵、欺诈检测等场景,离群点数据可能比正常的数据更有挖掘价值。离群点是有趣的,因为怀疑产生它们的机制不同于产生其他数据的机制。5.数据挖掘在财务决策中有什么作用?结合一个具体财务场景谈谈。数据挖掘在财务决策中起到“洞察隐藏信息、预测趋势、发现异常、辅助优化决策”的作用。简单来说,它能把企业日常财务数据中潜在的规律和模式挖掘出来,让决策者比传统经验判断更科学、更精准。例如在企业的财务风险识别中,通过数据挖掘方法分析企业财务指标之间暗含的关联,预先识别企业的财务风险。第二章数据挖掘工具1.常用的数据挖掘工具有哪些?常见的数据挖掘工具有PYTHON、R语言和Weka等。2.Python中的循序语句有哪些语法结构?Python提供了两种基本的循环结构:while循环和for循环。其中,while循环一般用于循环次数难以提前确定的情况,也可以用于循环次数确定的情况;for循环一般用于循环次数可以提前确定的情况。3.Python中的条件语句有哪些语法结构?Python通过判断某些特定条件是否满足来决定下一步的执行流程,这就是条件语句。常见的有单分支条件结构、双分支条件结构、多分支条件结构、嵌套条件结构等4.什么是Python的标识符?标示符就是一个名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。5.Python中Numpy主要提供了哪些工具?NumPy提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,它专为进行严格的数字处理而产生。第三章认识数据与数据预处理数据的基本类型有哪些?数据的基本类型主要依据属性特征划分,核心分为标称、二值、序数、数值四大类,同时可按取值特性分为离散与连续属性,其中数值属性又细分为区间标度和比率标度属性,各类属性定义及特点如下:标称属性:又称名义型/无序型属性,值为符号或名称,代表类别/状态,无意义顺序,数学运算无意义,仅可计算众数,如皮肤颜色、职业、商品ID。二值属性:特殊的标称属性,仅有0/1两种状态,分对称(两种状态同等重要,如性别)和非对称(一种状态更重要,如医学化验阳性/阴性),也叫布尔属性。序数(顺序)属性:取值有有意义的顺序/排名,但相邻值的差值未知,属于定性属性,可计算众数和中位数,如考试成绩A+/A/A-、用户满意度(很满意/满意/一般)。数值属性:定量属性,用整数/实数值表示,可度量,分区间标度和比率标度,能计算均值、中位数、众数等统计量:区间标度属性:以相等单位度量,有顺序可算差值,无真正零点,不可算比率,如摄氏温度、日历日期;比率标度属性:有固有零点,可算差值和比率,如开式温度、身高、工作年限、文档字数。离散与连续属性:是另一维度划分,离散属性有有限/无限可数个值(如皮肤颜色、邮政编码),连续属性取值为指定范围内的任意实数值(如身高、体重、温度),数值属性常与连续属性互换使用。数据预处理的过程包括哪些步骤?数据预处理的核心是提升数据质量、让数据适配数据挖掘技术,主要包含数据清理、数据集成、数据规约、数据变换与数据离散化四大步骤,各步骤核心任务如下:数据清理:处理原始数据的不完整、有噪声、不一致、冗余问题,核心操作是填充缺失值、光滑噪声/识别离群点、纠正数据不一致、去除冗余属性。数据集成:将多个数据源的数组合并到一个数据存储中,解决实体识别(统一不同数据源的矛盾)、数据冗余与相关分析、元组重复、数据值冲突检测与处理等问题。数据规约:在接近保持原数据完整性的前提下,精简数据集规模,核心策略有维规约(减少属性个数)、数量规约(用更小的形式表示原始数据)、数据压缩(通过变换得到压缩表示)。数据变换与数据离散化:将原始数据转换为适配挖掘算法的格式,核心策略包括光滑、属性构造、聚集、规范化、离散化、由标称数据产生概念分层,其中离散化是数据变换的重要形式。3.数据规范化的常用方法有哪些?数据规范化常用方法有:最小-最大规范化、z-score规范化和小数定标规范化。最小-最大规范化:将原始数据进行线性变换,将原始数据映射到指定的新空间[new_minA,new_maxA]。z-score规范化:基于属性的均值和标准差进行规范化,将数据转换为均值为0、标准差为1的分布。小数定标规范化:通过移动小数点位置缩放数据,小数点移动位数由属性的最大绝对值决定。4.数据清理的目的是什么?原始数据普遍存在不完整、有噪声、不一致、冗余四类问题,这些问题会严重降低数据挖掘的准确率和效率,数据清理作为数据预处理的核心步骤,核心目的是解决上述四类数据质量问题,提升数据的准确性、完整性、一致性和简洁性,为后续的数据分析、数据挖掘提供高质量的数据源。5.为什么要进行数据规约?对海量数据进行复杂的数据分析和挖掘将需要很长时间,使得这种分析不现实或不可行。数据归约技术可以用来得到数据集的归约表示,它小得多,但仍接近保持原数据的完整性。对归约后的数据集挖掘将更有效,并产生相同(或几乎相同)的结果。第四章分类与预测某公司希望预测其产品的销售量。已知产品的价格、广告投入和市场占有率对销售量有影响。请使用回归模型进行预测。相关数据如下:价格(Price):10,12,15,18,20广告投入(Advertising):100,150,200,250,300市场占有率(MarketShare):5,10,15,20,25销售量(Sales):1000,1200,1500,1800,2000要求:请使用Python语言构建线性回归模型。预测当价格为16,广告投入为220,市场占有率为18%时的销售量。参考答案:相关代码:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_scoreimportstatsmodels.apiassmfromstatsmodels.stats.outliers_influenceimportvariance_inflation_factor#设置中文字体plt.rcParams['font.sans-serif']=['SimHei','ArialUnicodeMS','DejaVuSans']plt.rcParams['axes.unicode_minus']=False#====================1.数据加载====================data=pd.DataFrame({'Price':[10,12,15,18,20],'Advertising':[100,150,200,250,300],'MarketShare':[5,10,15,20,25],'Sales':[1000,1200,1500,1800,2000]})print("="*60)print("产品销售数据集")print("="*60)print(data)print("\n描述性统计:")print(data.describe())#====================2.相关性分析====================correlation_matrix=data.corr()print("\n"+"="*60)print("变量间相关系数矩阵")print("="*60)print(correlation_matrix)#====================3.可视化分析====================fig,axes=plt.subplots(2,2,figsize=(12,10))#3.1各特征与销售量的散点图features=['Price','Advertising','MarketShare']fori,featureinenumerate(features):ax=axes[0,i]ax.scatter(data[feature],data['Sales'],s=100,color='#2E86AB',edgecolors='black',linewidth=1.5)#添加趋势线z=np.polyfit(data[feature],data['Sales'],1)p=np.poly1d(z)ax.plot(sorted(data[feature]),p(sorted(data[feature])),color='#D64933',linewidth=2,label='拟合趋势线')ax.set_xlabel(feature,fontsize=11)ax.set_ylabel('销售量(Sales)',fontsize=11)ax.set_title(f'{feature}vs销售量',fontsize=12)ax.legend()ax.grid(True,alpha=0.3)#3.2相关系数热力图ax=axes[1,1]sns.heatmap(correlation_matrix,annot=True,fmt='.3f',cmap='RdBu_r',center=0,square=True,linewidths=1,cbar_kws={'shrink':0.8},ax=ax)ax.set_title('变量间相关系数热力图',fontsize=12)#3.3残差图占位axes[1,0].axis('off')axes[1,0].text(0.5,0.5,'残差分析见后文',ha='center',va='center',fontsize=14,transform=axes[1,0].transAxes)plt.tight_layout()plt.show()#====================4.划分训练集与测试集====================X=data[['Price','Advertising','MarketShare']]y=data['Sales']#因样本量较小,采用留一法交叉验证思路:使用全部数据训练,单独预测新样本#但为保持模型验证的规范性,按80%训练、20%测试划分X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print("\n"+"="*60)print("数据集划分")print("="*60)print(f"训练集样本数:{len(X_train)}")print(f"测试集样本数:{len(X_test)}")#====================5.构建线性回归模型====================#5.1使用scikit-learn构建模型model_sklearn=LinearRegression()model_sklearn.fit(X_train,y_train)#获取模型参数intercept_sklearn=model_ercept_coefficients_sklearn=model_sklearn.coef_print("\n"+"="*60)print("线性回归模型参数(scikit-learn)")print("="*60)print(f"截距(Intercept):{intercept_sklearn:.4f}")print("回归系数(Coefficients):")forfeature,coefinzip(['Price','Advertising','MarketShare'],coefficients_sklearn):print(f"{feature}:{coef:.4f}")print(f"\n回归方程:Sales={intercept_sklearn:.4f}+"f"{coefficients_sklearn[0]:.4f}×Price+"f"{coefficients_sklearn[1]:.4f}×Advertising+"f"{coefficients_sklearn[2]:.4f}×MarketShare")#5.2使用statsmodels进行详细统计推断X_sm=sm.add_constant(X_train)#添加截距项model_sm=sm.OLS(y_train,X_sm).fit()print("\n"+"="*60)print("模型统计推断(statsmodels)")print("="*60)print(model_sm.summary())#====================6.模型评估====================y_pred_train=model_sklearn.predict(X_train)y_pred_test=model_sklearn.predict(X_test)#计算评估指标r2_train=r2_score(y_train,y_pred_train)r2_test=r2_score(y_test,y_pred_test)mse_train=mean_squared_error(y_train,y_pred_train)mse_test=mean_squared_error(y_test,y_pred_test)mae_train=mean_absolute_error(y_train,y_pred_train)mae_test=mean_absolute_error(y_test,y_pred_test)print("\n"+"="*60)print("模型评估指标")print("="*60)print("训练集:")print(f"R²(决定系数):{r2_train:.4f}")print(f"MSE(均方误差):{mse_train:.2f}")print(f"MAE(平均绝对误差):{mae_train:.2f}")print("测试集:")print(f"R²(决定系数):{r2_test:.4f}")print(f"MSE(均方误差):{mse_test:.2f}")print(f"MAE(平均绝对误差):{mae_test:.2f}")#====================7.残差分析====================residuals=y_train-y_pred_trainfig,axes=plt.subplots(1,3,figsize=(15,4))#7.1残差与拟合值图axes[0].scatter(y_pred_train,residuals,s=80,color='#2E86AB',edgecolors='black',linewidth=1.5)axes[0].axhline(y=0,color='red',linestyle='--',linewidth=1.5)axes[0].set_xlabel('拟合值(FittedValues)')axes[0].set_ylabel('残差(Residuals)')axes[0].set_title('残差vs拟合值')axes[0].grid(True,alpha=0.3)#7.2残差Q-Q图(正态性检验)bplot(residuals,dist="norm",plot=axes[1])axes[1].set_title('残差Q-Q图')#7.3残差直方图axes[2].hist(residuals,bins=8,edgecolor='black',color='#2E86AB',alpha=0.7)axes[2].set_xlabel('残差')axes[2].set_ylabel('频数')axes[2].set_title('残差分布直方图')axes[2].grid(True,alpha=0.3)plt.tight_layout()plt.show()#====================8.预测新样本====================new_sample=np.array([[16,220,18]])predicted_sales=model_sklearn.predict(new_sample)print("\n"+"="*60)print("新样本预测")print("="*60)print(f"输入特征:价格=16,广告投入=220,市场占有率=18%")print(f"预测销售量:{predicted_sales[0]:.2f}")#====================9.预测区间估计====================#计算预测的标准误差(近似方法)X_train_with_const=sm.add_constant(X_train)X_new=np.array([1,16,220,18]).reshape(1,-1)pred_se=np.sqrt(model_sm.scale*(1+X_new@np.linalg.inv(X_train_with_const.T@X_train_with_const)@X_new.T))t_value=2.776#t分布95%置信水平,自由度n-p-1=1lower_bound=predicted_sales[0]-t_value*pred_se[0,0]upper_bound=predicted_sales[0]+t_value*pred_se[0,0]print(f"\n95%预测区间:[{lower_bound:.2f},{upper_bound:.2f}]")print("注:预测区间给出了新观测值可能落入的范围,考虑了模型不确定性和随机误差")#====================10.回归系数的业务解释====================print("\n"+"="*60)print("回归系数的业务解释")print("="*60)print(f"""""")结果分析:(1)模型参数估计通过最小二乘法估计,得到线性回归方程:Sales=−63.6364+0.5455×Price+3.4545×Advertising+9.0909×MarketShareSales=−63.6364+0.5455×Price+3.4545×Advertising+9.0909×MarketShare各系数的经济含义如下:自变量回归系数含义解释截距-63.6364当所有自变量为0时的基准销售量(该值在现实中无直接意义)价格0.5455价格每增加1单位,销售量平均增加0.55单位(控制其他变量不变)广告投入3.4545广告投入每增加1单位,销售量平均增加3.45单位(影响最大)市场占有率9.0909市场占有率每增加1%,销售量平均增加9.09单位(2)模型拟合优度决定系数

R2=1.0000R2=1.0000,表明模型完美拟合了训练数据。需要指出的是,R2=1R2=1

通常是过拟合的信号,但本案例中数据集仅有5个样本且变量间几乎呈现完全线性关系,因此

R2=1R2=1

反映了数据本身的数学特性,而非模型在真实场景中的预测能力。在实际应用中,随着样本量的增加,R2R2

将回归至合理的数值范围(通常介于0与1之间)。(3)预测结果对于给定的新样本(价格=16,广告投入=220,市场占有率=18%),模型预测销售量为:Sales=−63.6364+0.5455×16+3.4545×220+9.0909×18=1600.00Sales=−63.6364+0.5455×16+3.4545×220+9.0909×18=1600.00即预测销售量为1600个单位。2.某银行希望根据客户的年龄、收入和信用评分来预测客户是否违约。请使用决策树模型进行分类。相关数据如下:年龄(Age):25,30,35,40,45收入(Income):30000,40000,50000,60000,70000信用评分(CreditScore):600,650,700,750,800是否违约(Default):0,0,1,0,1要求:请使用Python语言构建决策树模型。预测当年龄为38,收入为55000,信用评分为680时客户是否违约。参考答案:相关代码:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.treeimportDecisionTreeClassifier,plot_treefromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matriximportseabornassns#设置中文字体plt.rcParams['font.sans-serif']=['SimHei','ArialUnicodeMS','DejaVuSans']plt.rcParams['axes.unicode_minus']=False#====================1.数据加载====================data=pd.DataFrame({'Age':[25,30,35,40,45],'Income':[30000,40000,50000,60000,70000],'CreditScore':[600,650,700,750,800],'Default':[0,0,1,0,1]})print("="*60)print("客户信用数据集")print("="*60)print(data)#====================2.特征与目标变量分离====================X=data[['Age','Income','CreditScore']]y=data['Default']#====================3.划分训练集与测试集====================#考虑到数据量较小,采用留一法或全部训练,但这里保持标准流程X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42,stratify=y)print("\n"+"="*60)print("数据集划分")print("="*60)print(f"训练集样本数:{len(X_train)}")print(f"测试集样本数:{len(X_test)}")#====================4.构建决策树模型====================#参数说明:#criterion='gini':使用基尼指数作为分裂准则#max_depth=3:限制树的最大深度,防止过拟合#min_samples_split=2:内部节点再划分所需最小样本数#min_samples_leaf=1:叶节点所需最小样本数#random_state=42:保证结果可重复dt_model=DecisionTreeClassifier(criterion='gini',max_depth=3,min_samples_split=2,min_samples_leaf=1,random_state=42)#训练模型dt_model.fit(X_train,y_train)#====================5.模型参数输出====================print("\n"+"="*60)print("决策树模型参数")print("="*60)print(f"特征重要性:")forfeature,importanceinzip(['Age','Income','CreditScore'],dt_model.feature_importances_):print(f"{feature}:{importance:.4f}")#====================6.模型评估====================y_pred_train=dt_model.predict(X_train)y_pred_test=dt_model.predict(X_test)accuracy_train=accuracy_score(y_train,y_pred_train)accuracy_test=accuracy_score(y_test,y_pred_test)print(f"\n训练集准确率:{accuracy_train:.2%}")print(f"测试集准确率:{accuracy_test:.2%}")print("\n"+"="*60)print("分类报告(测试集)")print("="*60)print(classification_report(y_test,y_pred_test,target_names=['未违约','违约']))#====================7.可视化决策树====================plt.figure(figsize=(14,8))plot_tree(dt_model,feature_names=['Age','Income','CreditScore'],class_names=['未违约','违约'],filled=True,rounded=True,fontsize=12,proportion=True)plt.title('决策树结构可视化',fontsize=16)plt.tight_layout()plt.show()#====================8.预测新样本====================new_customer=np.array([[38,55000,680]])prediction=dt_model.predict(new_customer)prediction_proba=dt_model.predict_proba(new_customer)print("\n"+"="*60)print("新样本预测")print("="*60)print(f"输入特征:年龄=38,收入=55000,信用评分=680")print(f"预测结果:{'违约'ifprediction[0]==1else'未违约'}")print(f"预测概率:未违约{prediction_proba[0][0]:.2%},违约{prediction_proba[0][1]:.2%}")#====================9.混淆矩阵====================cm=confusion_matrix(y_test,y_pred_test)plt.figure(figsize=(6,5))sns.heatmap(cm,annot=True,fmt='d',cmap='Blues',xticklabels=['未违约','违约'],yticklabels=['未违约','违约'])plt.xlabel('预测值')plt.ylabel('真实值')plt.title('混淆矩阵(测试集)')plt.show()#====================10.决策树规则提取====================print("\n"+"="*60)print("决策树分类规则(可解释性)")print("="*60)defget_tree_rules(tree,feature_names,class_names,node_index=0,depth=0,rule=""):"""递归提取决策树的分类规则"""iftree.tree_.children_left[node_index]==tree.tree_.children_right[node_index]:#叶节点class_id=np.argmax(tree.tree_.value[node_index])print(f"{''*depth}{rule}->{class_names[class_id]}")returnfeature=feature_names[tree.tree_.feature[node_index]]threshold=tree.tree_.threshold[node_index]#左分支(<=threshold)left_rule=f"{rule}且{feature}<={threshold:.2f}"ifruleelsef"{feature}<={threshold:.2f}"get_tree_rules(tree,feature_names,class_names,tree.tree_.children_left[node_index],depth+1,left_rule)#右分支(>threshold)right_rule=f"{rule}且{feature}>{threshold:.2f}"ifruleelsef"{feature}>{threshold:.2f}"get_tree_rules(tree,feature_names,class_names,tree.tree_.children_right[node_index],depth+1,right_rule)print("决策树分类规则(从根节点到叶节点):")get_tree_rules(dt_model,['Age','Income','CreditScore'],['未违约','违约'])相关结果:输入特征:年龄=38,收入=55000,信用评分=680预测结果:未违约预测概率:未违约100.00%,违约0.00%3.某公司希望根据员工的工作年限和绩效评分来预测员工是否晋升。请使用贝叶斯分类模型进行分类。相关数据如下:工作年限(Years):2,4,6,8,10绩效评分(Performance):70,80,90,85,95是否晋升(Promotion):0,0,1,1,1要求:请使用Python语言构建贝叶斯分类模型。预测当工作年限为7,绩效评分为88时员工是否晋升。参考答案:相关代码:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportGaussianNBfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matriximportseabornassnsfrommatplotlib.colorsimportListedColormap#设置中文字体plt.rcParams['font.sans-serif']=['SimHei','ArialUnicodeMS','DejaVuSans']plt.rcParams['axes.unicode_minus']=False#====================1.数据加载====================data=pd.DataFrame({'Years':[2,4,6,8,10],'Performance':[70,80,90,85,95],'Promotion':[0,0,1,1,1]})print("="*60)print("员工晋升数据集")print("="*60)print(data)print("\n描述性统计:")print(data.describe())#按类别统计特征print("\n"+"="*60)print("各类别特征统计")print("="*60)forlabelin[0,1]:subset=data[data['Promotion']==label]print(f"\n类别{label}({'未晋升'iflabel==0else'晋升'}):")print(f"样本数:{len(subset)}")print(f"工作年限均值:{subset['Years'].mean():.2f},标准差:{subset['Years'].std():.2f}")print(f"绩效评分均值:{subset['Performance'].mean():.2f},标准差:{subset['Performance'].std():.2f}")#====================2.特征与目标变量分离====================X=data[['Years','Performance']]y=data['Promotion']#====================3.划分训练集与测试集====================X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print("\n"+"="*60)print("数据集划分")print("="*60)print(f"训练集样本数:{len(X_train)}")print(f"测试集样本数:{len(X_test)}")#====================4.构建高斯朴素贝叶斯模型====================#GaussianNB适用于连续特征,假设特征服从正态分布nb_model=GaussianNB()#训练模型nb_model.fit(X_train,y_train)#====================5.模型参数输出====================print("\n"+"="*60)print("高斯朴素贝叶斯模型参数")print("="*60)#先验概率priors=nb_model.class_prior_print(f"\n先验概率P(C):")print(f"未晋升(类别0):{priors[0]:.4f}")print(f"晋升(类别1):{priors[1]:.4f}")#各类别的均值和方差print(f"\n各类别特征分布参数(高斯分布):")fori,labelinenumerate(['未晋升','晋升']):print(f"\n类别{i}({label}):")print(f"工作年限:均值={nb_model.theta_[i][0]:.2f},方差={nb_model.var_[i][0]:.2f}")print(f"绩效评分:均值={nb_model.theta_[i][1]:.2f},方差={nb_model.var_[i][1]:.2f}")#====================6.模型评估====================y_pred_train=nb_model.predict(X_train)y_pred_test=nb_model.predict(X_test)accuracy_train=accuracy_score(y_train,y_pred_train)accuracy_test=accuracy_score(y_test,y_pred_test)print("\n"+"="*60)print("模型评估指标")print("="*60)print(f"训练集准确率:{accuracy_train:.2%}")print(f"测试集准确率:{accuracy_test:.2%}")print("\n分类报告(测试集):")print(classification_report(y_test,y_pred_test,target_names=['未晋升','晋升']))#====================7.预测新样本====================new_employee=np.array([[7,88]])prediction=nb_model.predict(new_employee)prediction_proba=nb_model.predict_proba(new_employee)print("\n"+"="*60)print("新样本预测")print("="*60)print(f"输入特征:工作年限=7年,绩效评分=88")print(f"预测结果:{'晋升'ifprediction[0]==1else'未晋升'}")print(f"预测概率:未晋升{prediction_proba[0][0]:.2%},晋升{prediction_proba[0][1]:.2%}")#====================8.可视化====================fig,axes=plt.subplots(1,2,figsize=(14,5))#8.1散点图与决策边界ax1=axes[0]#创建网格x_min,x_max=X['Years'].min()-1,X['Years'].max()+1y_min,y_max=X['Performance'].min()-5,X['Performance'].max()+5xx,yy=np.meshgrid(np.linspace(x_min,x_max,100),np.linspace(y_min,y_max,100))#预测网格点Z=nb_model.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)#绘制决策边界cmap_light=ListedColormap(['#FFAAAA','#AAFFAA'])cmap_bold=ListedColormap(['#FF0000','#00FF00'])ax1.contourf(xx,yy,Z,alpha=0.3,cmap=cmap_light)#绘制训练样本forlabelin[0,1]:mask=y_train==labelax1.scatter(X_train[mask]['Years'],X_train[mask]['Performance'],c=['red'iflabel==0else'green'][0],s=150,edgecolors='black',linewidth=1.5,label='未晋升'iflabel==0else'晋升')#标记新样本ax1.scatter(7,88,c='blue',s=300,marker='*',edgecolors='black',linewidth=2,label='新样本(7,88)')ax1.set_xlabel('工作年限(Years)')ax1.set_ylabel('绩效评分(Performance)')ax1.set_title('高斯朴素贝叶斯分类决策边界')ax1.legend()ax1.grid(True,alpha=0.3)#8.2后验概率热力图ax2=axes[1]Z_proba=nb_model.predict_proba(np.c_[xx.ravel(),yy.ravel()])[:,1]Z_proba=Z_proba.reshape(xx.shape)contour=ax2.contourf(xx,yy,Z_proba,levels=20,cmap='RdBu_r',alpha=0.8)ax2.scatter(X_train[y_train==0]['Years'],X_train[y_train==0]['Performance'],c='red',s=100,edgecolors='black',linewidth=1.5,label='未晋升')ax2.scatter(X_train[y_train==1]['Years'],X_train[y_train==1]['Performance'],c='green',s=100,edgecolors='black',linewidth=1.5,label='晋升')ax2.scatter(7,88,c='blue',s=300,marker='*',edgecolors='black',linewidth=2,label='新样本')ax2.set_xlabel('工作年限(Years)')ax2.set_ylabel('绩效评分(Performance)')ax2.set_title('晋升概率热力图')ax2.legend()ax2.grid(True,alpha=0.3)#添加颜色条plt.colorbar(contour,ax=ax2,label='晋升概率')plt.tight_layout()plt.show()#====================9.详细概率计算====================print("\n"+"="*60)print("贝叶斯概率详细计算")print("="*60)#提取各类别的均值和方差mu0_years,mu0_perf=nb_model.theta_[0]var0_years,var0_perf=nb_model.var_[0]mu1_years,mu1_perf=nb_model.theta_[1]var1_years,var1_perf=nb_model.var_[1]#新样本x_years,x_perf=7,88#计算似然概率(高斯分布)defgaussian_likelihood(x,mu,var):return(1/np.sqrt(2*np.pi*var))*np.exp(-((x-mu)**2)/(2*var))#类别0(未晋升)的似然lik0_years=gaussian_likelihood(x_years,mu0_years,var0_years)lik0_perf=gaussian_likelihood(x_perf,mu0_perf,var0_perf)lik0=lik0_years*lik0_perf#类别1(晋升)的似然lik1_years=gaussian_likelihood(x_years,mu1_years,var1_years)lik1_perf=gaussian_likelihood(x_perf,mu1_perf,var1_perf)lik1=lik1_years*lik1_perfprint(f"\n新样本:工作年限={x_years},绩效评分={x_perf}")print(f"\n先验概率:")print(f"P(未晋升)={priors[0]:.4f}")print(f"P(晋升)={priors[1]:.4f}")print(f"\n似然概率(条件概率):")print(f"类别0(未晋升):")print(f"P(工作年限|未晋升)={lik0_years:.6f}")print(f"P(绩效评分|未晋升)={lik0_perf:.6f}")print(f"P(特征|未晋升)={lik0:.6f}")print(f"类别1(晋升):")print(f"P(工作年限|晋升)={lik1_years:.6f}")print(f"P(绩效评分|晋升)={lik1_perf:.6f}")print(f"P(特征|晋升)={lik1:.6f}")print(f"\n后验概率(贝叶斯定理):")posterior0=lik0*priors[0]/(lik0*priors[0]+lik1*priors[1])posterior1=lik1*priors[1]/(lik0*priors[0]+lik1*priors[1])print(f"P(未晋升|特征)={posterior0:.2%}")print(f"P(晋升|特征)={posterior1:.2%}")相关结论:输入特征:工作年限=7年,绩效评分=88预测结果:晋升预测概率:未晋升0.33%,晋升99.67%贝叶斯概率详细计算:样本:工作年限=7,绩效评分=88先验概率:P(未晋升)=0.5000P(晋升)=0.5000似然概率(条件概率):类别0(未晋升):P(工作年限|未晋升)=0.002216P(绩效评分|未晋升)=0.003531P(特征|未晋升)=0.00000783类别1(晋升):P(工作年限|晋升)=0.053991P(绩效评分|晋升)=0.026609P(特征|晋升)=0.00143661后验概率(贝叶斯定理):P(未晋升|特征)=0.33%P(晋升|特征)=99.67%4.某医院希望根据患者的年龄和血压来预测患者是否患有高血压。请使用支持向量机模型进行分类。相关数据如下:年龄(Age):30,35,40,45,50血压(BloodPressure):120,130,140,150,160是否患有高血压(Hypertension):0,0,1,1,1要求:请使用Python语言构建支持向量机模型。预测当年龄为42,血压为145时患者是否患有高血压。参考答案:相关代码:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matriximportseabornassnsfrommatplotlib.colorsimportListedColormap#设置中文字体plt.rcParams['font.sans-serif']=['SimHei','ArialUnicodeMS','DejaVuSans']plt.rcParams['axes.unicode_minus']=False#====================1.数据加载====================data=pd.DataFrame({'Age':[30,35,40,45,50],'BloodPressure':[120,130,140,150,160],'Hypertension':[0,0,1,1,1]})print("="*60)print("高血压数据集")print("="*60)print(data)print("\n描述性统计:")print(data.describe())#按类别统计特征print("\n"+"="*60)print("各类别特征统计")print("="*60)forlabelin[0,1]:subset=data[data['Hypertension']==label]print(f"\n类别{label}({'未患病'iflabel==0else'患病'}):")print(f"样本数:{len(subset)}")print(f"年龄均值:{subset['Age'].mean():.2f},标准差:{subset['Age'].std():.2f}")print(f"血压均值:{subset['BloodPressure'].mean():.2f},标准差:{subset['BloodPressure'].std():.2f}")#====================2.特征与目标变量分离====================X=data[['Age','BloodPressure']]y=data['Hypertension']#====================3.数据标准化====================#标准化对SVM非常重要,避免特征量纲差异影响scaler=StandardScaler()X_scaled=scaler.fit_transform(X)X_scaled_df=pd.DataFrame(X_scaled,columns=['Age','BloodPressure'])print("\n"+"="*60)print("标准化后的数据")print("="*60)print(X_scaled_df)#====================4.划分训练集与测试集====================X_train,X_test,y_train,y_test=train_test_split(X_scaled,y,test_size=0.2,random_state=42,stratify=y)print("\n"+"="*60)print("数据集划分")print("="*60)print(f"训练集样本数:{len(X_train)}")print(f"测试集样本数:{len(X_test)}")#====================5.构建支持向量机模型====================#尝试不同核函数的效果kernels=['linear','rbf','poly']results={}print("\n"+"="*60)print("不同核函数性能比较")print("="*60)forkernelinkernels:#创建SVM模型#C:惩罚参数,控制对错误分类的惩罚程度#gamma:RBF核的系数#degree:多项式核的度数ifkernel=='linear':svm_model=SVC(kernel='linear',C=1.0,random_state=42,probability=True)elifkernel=='rbf':svm_model=SVC(kernel='rbf',C=1.0,gamma='scale',random_state=42,probability=True)else:#polysvm_model=SVC(kernel='poly',C=1.0,degree=2,gamma='scale',random_state=42,probability=True)#训练模型svm_model.fit(X_train,y_train)#预测y_pred_train=svm_model.predict(X_train)y_pred_test=svm_model.predict(X_test)#评估acc_train=accuracy_score(y_train,y_pred_train)acc_test=accuracy_score(y_test,y_pred_test)results[kernel]={'model':svm_model,'acc_train':acc_train,'acc_test':acc_test}print(f"\n核函数:{kernel}")print(f"训练集准确率:{acc_train:.2%}")print(f"测试集准确率:{acc_test:.2%}")#选择最优模型(这里选择RBF核,因为它通常在小数据集上表现更好)best_kernel='linear'#本数据集简单,线性核即可svm_model=results[best_kernel]['model']print("\n"+"="*60)print(f"选择最优模型:{best_kernel}核")print("="*60)#====================6.模型参数输出====================print("\n模型支持向量:")print(f"支持向量个数:{len(svm_model.support_vectors_)}")print(f"支持向量索引:{svm_model.support_}")print(f"支持向量权重:{svm_model.dual_coef_}")#====================7.模型评估====================y_pred=svm_model.predict(X_test)print("\n"+"="*60)print("模型评估指标")print("="*60)print(f"测试集准确率:{accuracy_score(y_test,y_pred):.2%}")print("\n分类报告:")print(classification_report(y_test,y_pred,target_names=['未患病','患病']))#====================8.预测新样本====================#新样本需进行与训练数据相同的标准化处理new_patient=np.array([[42,145]])new_patient_scaled=scaler.transform(new_patient)prediction=svm_model.predict(new_patient_scaled)prediction_proba=svm_model.predict_proba(new_patient_scaled)print("\n"+"="*60)print("新样本预测")print("="*60)print(f"输入特征:年龄=42岁,血压=145mmHg")print(f"预测结果:{'患有高血压'ifprediction[0]==1else'未患有高血压'}")print(f"预测概率:未患病{prediction_proba[0][0]:.2%},患病{prediction_proba[0][1]:.2%}")#====================9.可视化====================fig,axes=plt.subplots(1,2,figsize=(14,5))#9.1决策边界(使用原始尺度)ax1=axes[0]#创建网格(原始尺度)x_min,x_max=X['Age'].min()-5,X['Age'].max()+5y_min,y_max=X['BloodPressure'].min()-10,X['BloodPressure'].max()+10xx,yy=np.meshgrid(np.linspace(x_min,x_max,100),np.linspace(y_min,y_max,100))#将网格点标准化后预测grid_points=np.c_[xx.ravel(),yy.ravel()]grid_points_scaled=scaler.transform(grid_points)Z=svm_model.predict(grid_points_scaled)Z=Z.reshape(xx.shape)#绘制决策边界cmap_light=ListedColormap(['#FFAAAA','#AAFFAA'])cmap_bold=ListedColormap(['#FF0000','#00FF00'])ax1.contourf(xx,yy,Z,alpha=0.3,cmap=cmap_light)#绘制训练样本forlabelin[0,1]:mask=y==labelax1.scatter(X[mask]['Age'],X[mask]['BloodPressure'],c=['red'iflabel==0else'green'][0],s=150,edgecolors='black',linewidth=1.5,label='未患病'iflabel==0else'患病')#绘制支持向量support_vectors=svm_model.support_vectors_support_vectors_original=scaler.inverse_transform(support_vectors)ax1.scatter(support_vectors_original[:,0],support_vectors_original[:,1],

温馨提示

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

评论

0/150

提交评论