人工智能导论-技术、应用及伦理 教案 实验3 决策树分类与 K 均值聚类、实验4 机器学习伦理与公平性评估_第1页
人工智能导论-技术、应用及伦理 教案 实验3 决策树分类与 K 均值聚类、实验4 机器学习伦理与公平性评估_第2页
人工智能导论-技术、应用及伦理 教案 实验3 决策树分类与 K 均值聚类、实验4 机器学习伦理与公平性评估_第3页
人工智能导论-技术、应用及伦理 教案 实验3 决策树分类与 K 均值聚类、实验4 机器学习伦理与公平性评估_第4页
人工智能导论-技术、应用及伦理 教案 实验3 决策树分类与 K 均值聚类、实验4 机器学习伦理与公平性评估_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

实验3决策树分类与K均值聚类一、实验目的及要求理解决策树分类算法的基本思想,掌握使用scikit-learn构建决策树模型的方法。理解决策树的可解释性优势,能够对生成的决策树进行可视化解读,并据此说明模型“为什么做出某种预测”。理解无监督学习中聚类任务的基本思想,掌握K均值聚类算法的实现步骤(初始化、分配、更新、迭代)。掌握肘部法则(ElbowMethod)确定聚类数K的方法,能够对聚类结果进行可视化与业务解释。理解PCA降维在可视化高维数据、辅助聚类分析中的作用。二、实验学时2学时(建议时间分配:讲解10分钟,任务实践80分钟,总结报告10分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Pandas、Matplotlib、scikit-learn。安装命令如下:pipinstallnumpypandasmatplotlibscikit-learn知识储备:已学习教材第4.3.2节(无监督学习)与4.4.3、4.4.4节(决策树、K均值聚类)。四、实验任务任务1决策树水果分类(35分钟)使用教材表4-8的水果识别数据(颜色、大小、形状、真实类别),构建决策树分类器。将类别特征编码后训练模型,并使用sklearn.tree.plot_tree可视化决策路径。对新样本(颜色=红、大小=大、形状=圆)进行预测,并手动追踪决策路径验证结果。任务2K均值水果聚类(30分钟)使用教材表4-9的水果特征数据(甜度、水分),实现K均值聚类。分别尝试K=2、3、4,使用肘部法则(inertia随K的变化曲线)辅助选择合理的K值。任务3聚类结果可视化与评价(15分钟)绘制不同K值下的聚类散点图,将聚类结果与真实类别对比,计算调整兰德指数(ARI),定量评价聚类效果。参考代码以下为完整可运行代码。若图表中文显示为方框,请根据本地环境修改plt.rcParams中的字体名称:#实验四:决策树分类与K均值聚类

importnumpyasnp

importpandasaspd

importmatplotlib.pyplotasplt

fromsklearn.preprocessingimportLabelEncoder

fromsklearn.treeimportDecisionTreeClassifier,plot_tree

fromsklearn.clusterimportKMeans

fromsklearn.metricsimportadjusted_rand_score

#设置中文字体

plt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei','ArialUnicodeMS']

plt.rcParams['axes.unicode_minus']=False

#====================任务1:决策树水果分类====================

fruit_df=pd.DataFrame({

"颜色":["红","红","黄","黄","红","红","黄","红"],

"大小":["大","大","大","大","小","小","大","大"],

"形状":["圆","圆","长","长","圆","圆","圆","圆"],

"类别":["苹果","苹果","香蕉","香蕉","樱桃","樱桃","西瓜","西瓜"]

})

le_color=LabelEncoder()

le_size=LabelEncoder()

le_shape=LabelEncoder()

le_label=LabelEncoder()

X_tree=pd.DataFrame({

"颜色":le_color.fit_transform(fruit_df["颜色"]),

"大小":le_size.fit_transform(fruit_df["大小"]),

"形状":le_shape.fit_transform(fruit_df["形状"])

})

y_tree=le_label.fit_transform(fruit_df["类别"])

#限制树深度,避免过拟合

clf=DecisionTreeClassifier(criterion="gini",max_depth=3,random_state=42)

clf.fit(X_tree,y_tree)

plt.figure(figsize=(14,7))

plot_tree(clf,feature_names=["颜色","大小","形状"],

class_names=le_label.classes_,filled=True,rounded=True,fontsize=12)

plt.title("决策树水果分类器")

plt.show()

#预测新样本:红、大、圆

new=pd.DataFrame({

"颜色":[le_color.transform(["红"])[0]],

"大小":[le_size.transform(["大"])[0]],

"形状":[le_shape.transform(["圆"])[0]]

})

pred=le_label.inverse_transform(clf.predict(new))

print(f"新样本(红、大、圆)预测类别:{pred[0]}")

#====================任务2:K均值水果聚类====================

cluster_df=pd.DataFrame({

"甜度":[2.0,1.5,2.5,7.0,8.0,7.5,5.0,5.5,6.0,

1.0,8.5,4.5,2.2,6.5,7.8],

"水分":[9.0,8.5,8.0,4.0,3.5,4.5,5.0,5.5,6.0,

9.5,3.0,5.8,8.8,5.2,3.8],

"真实类别":["西瓜","西瓜","西瓜","香蕉","香蕉","香蕉","苹果",

"苹果","苹果","西瓜","香蕉","苹果","西瓜","苹果","香蕉"]

})

X_cluster=cluster_df[["甜度","水分"]]

#肘部法则

inertias=[]

K_range=range(1,7)

forkinK_range:

kmeans=KMeans(n_clusters=k,random_state=42,n_init=10)

kmeans.fit(X_cluster)

inertias.append(kmeans.inertia_)

plt.figure(figsize=(12,5))

plt.subplot(1,2,1)

plt.plot(K_range,inertias,marker="o")

plt.xlabel("聚类数K")

plt.ylabel("Inertia(簇内平方和)")

plt.title("肘部法则")

plt.grid(True)

#K=3可视化

kmeans3=KMeans(n_clusters=3,random_state=42,n_init=10)

labels3=kmeans3.fit_predict(X_cluster)

plt.subplot(1,2,2)

colors=labels3

plt.scatter(X_cluster["甜度"],X_cluster["水分"],c=colors,cmap="viridis",s=100)

plt.scatter(kmeans3.cluster_centers_[:,0],kmeans3.cluster_centers_[:,1],

marker="X",s=200,c="red",label="簇中心")

plt.xlabel("甜度")

plt.ylabel("水分")

plt.title("K=3聚类结果")

plt.legend()

plt.tight_layout()

plt.show()

#用真实类别计算ARI(仅用于教学演示,聚类本身不使用标签)

true_labels=LabelEncoder().fit_transform(cluster_df["真实类别"])

ari=adjusted_rand_score(true_labels,labels3)

print(f"\nK=3时ARI={ari:.4f}(越接近1表示聚类结果与真实分类越一致)")

预期结果(参考)决策树:新样本(红、大、圆)预测为“苹果”。由于训练数据量很小,决策树可能实现完美分类,这是教学示例,真实场景中应通过max_depth、min_samples_leaf等参数防止过拟合。K均值聚类:肘部法则通常在K=3处出现明显“拐点”;K=3时ARI≈1.0000,说明聚类结果与真实水果类别完全一致。结果记录表请将你的实验结果填入下表:项目结果说明决策树预测(红、大、圆)追踪决策路径得到的类别肘部法则推荐K值根据inertia曲线拐点判断K=3时ARI聚类结果与真实类别的吻合程度簇1特征概括例如:低甜度、高水分簇2特征概括例如:高甜度、低水分簇3特征概括例如:甜度与水分均衡五、实验重点、难点重点:决策树的构建原理与可视化、K均值聚类的“分配—更新”迭代流程、肘部法则确定K值。难点:理解决策树中基尼不纯度/信息增益的划分逻辑;控制决策树深度以避免过拟合;理解K均值对初始簇中心敏感及多次运行取最优的必要性。六、操作要点决策树可视化使用sklearn.tree.plot_tree,无需额外安装Graphviz。K均值聚类前建议对特征进行标准化,尤其当不同特征量纲差异较大时。运行K均值时设置random_state与n_init参数,以获得稳定、可复现的结果。比较聚类结果与真实类别时,仅使用ARI等外部指标做教学验证,切勿在真实无监督任务中“偷看”标签调参。七、注意事项单棵决策树对数据扰动敏感,深度过大容易过拟合;实验中应通过max_depth、min_samples_leaf等参数限制树的大小。K均值假设簇为近似球形且大小相近,若数据分布明显不满足该假设,可考虑DBSCAN或高斯混合模型。类别型特征在输入K均值前需合理编码,不建议直接将无大小意义的类别标签作为数值输入。肘部法则中的“肘部”有时并不十分明显,应结合业务理解综合判断K值。八、实验报告要求画出决策树的主要决策路径,说明模型如何区分苹果、香蕉、樱桃、西瓜。根据肘部法则和ARI结果,解释为什么选择K=3。为每个簇赋予一个业务名称(如“多汁解渴型”),并说明理由。思考题:决策树与K均值聚类的根本区别是什么?(提示:是否有标签?模型学到了什么?)实验4机器学习伦理与公平性评估一、实验目的及要求理解机器学习应用中可能存在的数据偏见、虚假特征等伦理风险及其形成机制。掌握通过分组评估识别模型公平性问题的方法,能够计算并比较不同群体间的准确率、精确率、召回率差异。掌握移除敏感属性、重采样等简单的去偏处理思路,并理解其适用场景与局限。能够从“数据非中立,开发者即责任主体”的角度审视机器学习项目,强化“科技向善”的价值导向。培养对模型输出进行批判性验证的习惯,不将模型结果视为唯一真理。二、实验学时2学时(建议时间分配:讲解15分钟,任务实践75分钟,总结报告10分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Pandas、scikit-learn。安装命令如下:pipinstallnumpypandasscikit-learn知识储备:已学习教材第4.5节(机器学习的潜在风险),理解历史偏见、采样偏见、标签偏见与虚假特征的概念。四、实验任务任务1案例分析与数据集构建(15分钟)回顾教材中“简历筛选AI系统”与“超市盗窃识别系统”两个案例,分析数据偏见与虚假特征的来源。随后构建一个模拟的简历筛选数据集,包含:性别、笔试成绩、面试评分、实习时长、是否录用。在历史偏见模拟中,设定女性录用率系统性低于男性。任务2训练“有偏”模型并分组评估(20分钟)将性别作为特征之一,训练逻辑回归模型;分别计算总体准确率与按性别划分的准确率、精确率、召回率,观察差异。任务3去偏处理实验(20分钟)移除性别特征后重新训练模型,再次进行分组评估,比较总体指标与分组指标的变化。任务4虚假特征识别(10分钟)向数据集中加入一个与录用结果无因果关系的“伪特征”(如应聘者编号的末位数字),训练模型并观察该特征是否被赋予非零权重,讨论其危害。任务5讨论与报告(10分钟)结合实验结果,回答:①数据偏见如何被模型继承并放大?②移除敏感属性能否完全消除偏见?③在风险敏感场景中应如何设置人工复核机制?参考代码以下为完整可运行代码:#实验五:机器学习伦理与公平性评估

importnumpyasnp

importpandasaspd

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.preprocessingimportStandardScaler

fromsklearn.linear_modelimportLogisticRegression

fromsklearn.metricsimportaccuracy_score,precision_score,recall_score

np.random.seed(42)

n=400

#1.构造含历史偏见的数据集

#笔试成绩、面试评分、实习时长是真实能力信号

exam=np.random.normal(75,8,n)

interview=np.random.normal(75,8,n)

internship=np.random.uniform(0,24,n)

gender=np.random.choice(["男","女"],n)

#真实录用概率只取决于能力信号

ability_score=0.5*exam+0.5*interview+0.8*internship

true_prob=1/(1+np.exp(-(ability_score-80)/12))

true_hired=(np.random.random(n)<true_prob).astype(int)

#引入历史偏见:同等能力下女性录用率降低约25%

hired=true_hired.copy()

hired[(gender=="女")&(true_hired==1)]=(

np.random.random(sum((gender=="女")&(true_hired==1)))>0.25

).astype(int)

df=pd.DataFrame({

"性别":gender,

"笔试成绩":exam,

"面试评分":interview,

"实习时长":internship,

"编号末位":np.random.randint(0,10,n),#虚假特征

"是否录用":hired

})

print("数据集概况:")

print(df.head())

print("\n按性别统计录用率:")

print(df.groupby("性别")["是否录用"].mean())

#2.定义评估函数

defevaluate(model,X,y,group):

y_pred=model.predict(X)

print(f"总体准确率:{accuracy_score(y,y_pred):.4f}")

forgingroup.unique():

mask=group==g

ify[mask].sum()>0:

print(f"{g}群体准确率={accuracy_score(y[mask],y_pred[mask]):.4f},"

f"精确率={precision_score(y[mask],y_pred[mask],zero_division=0):.4f},"

f"召回率={recall_score(y[mask],y_pred[mask],zero_division=0):.4f}")

else:

print(f"{g}群体准确率={accuracy_score(y[mask],y_pred[mask]):.4f}")

#3.训练含性别特征的“有偏”模型

X_biased=pd.get_dummies(df.drop("是否录用",axis=1),columns=["性别"],drop_first=True)

y=df["是否录用"]

X_train,X_test,y_train,y_test=train_test_split(

X_biased,y,test_size=0.2,random_state=42

)

num_cols=["笔试成绩","面试评分","实习时长","编号末位"]

scaler=StandardScaler()

X_train[num_cols]=scaler.fit_transform(X_train[num_cols])

X_test[num_cols]=scaler.transform(X_test[num_cols])

model_biased=LogisticRegression(random_state=42,solver='liblinear')

model_biased.fit(X_train,y_train)

print("\n===模型A:含性别特征===")

evaluate(model_biased,X_test,y_test,df.loc[X_test.index,"性别"])

print("特征权重:")

forname,coefinzip(X_biased.columns,model_biased.coef_[0]):

print(f"{name}:{coef:.4f}")

#4.移除性别特征后重新训练

X_fair=X_biased.drop(columns=["性别_男"])

X_train_f,X_test_f,y_train_f,y_test_f=train_test_split(

X_fair,y,test_size=0.2,random_state=42

)

X_train_f[num_cols]=scaler.fit_transform(X_train_f[num_cols])

X_test_f[num_cols]=scaler.transform(X_test_f[num_cols])

model_fair=LogisticRegression(random_state=42,solver='liblinear')

model_fair.fit(X_train_f,y_train_f)

print("\n===模型B:移除性别特征===")

evaluate(model_fair,X_test_f,y_test_f,df.loc[X_test_f.index,"性别"])

print("特征权重:")

forname,coefinzip(X_fair.columns,model_fair.coef_[0]):

print(f"{name}:{coef:.4f}")

#5.讨论问题(写入实验报告)

print("\n思考题:")

print("1.为什么模型A中性别特征的权重不为零?")

print("2.移除性别特征后,男女群体的准确率差异是否缩小?为什么仍可能存在差异?")

print("3.虚假特征“编号末位”的权重说明了什么?")

预期结果(参考)运行代码后,你应看到类似以下的结果:按性别统计录用率:

性别

女0.4577

男0.5930

===模型A:含性别特征===

总体准确率:0.7000

女群体准确率=0.6410,精确率=0.6250,召回率=0.5556

温馨提示

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

评论

0/150

提交评论