版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验1基于线性回归的房价预测一、实验目的及要求理解监督学习中回归任务的基本思想,掌握“数据准备→选择模型→定义损失函数→训练模型→评估与应用”的机器学习基本流程。掌握使用scikit-learn构建线性回归模型的方法,理解模型参数(权重、偏置)的含义及其对预测结果的影响。掌握训练集/测试集的划分方法,理解划分的目的在于客观评估模型在未见过数据上的泛化能力。掌握均方误差(MSE)、平均绝对误差(MAE)、决定系数(R²)等回归评估指标的计算方法与业务含义。能够对预测结果进行可视化分析,并能够结合线性回归的假设条件(线性关系、异常值敏感性等)判断模型的适用性与局限性。二、实验学时2学时(建议时间分配:讲解10分钟,任务实践80分钟,总结报告10分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Pandas、Matplotlib、scikit-learn。安装命令如下:pipinstallnumpypandasmatplotlibscikit-learn知识储备:已学习教材第4.1、4.2、4.3.1、4.4.1节内容,了解回归与分类的区别。四、实验任务任务1环境准备与数据集加载(10分钟)实验采用模拟生成的房价数据集,不依赖网络下载。数据集包含面积、卧室数、距市中心距离、楼层、房龄5个数值型特征,以及房价(万元)1个连续型目标变量。任务2数据探索与划分(15分钟)使用Pandas观察样本量、特征名称与统计分布;按8:2划分为训练集与测试集。注意:划分必须在任何预处理之前完成,避免测试集信息泄漏。任务3特征标准化(10分钟)由于面积、房龄、楼层等特征量纲不同,使用StandardScaler对训练集进行标准化,并用训练集的均值和标准差转换测试集。任务4模型训练与预测(15分钟)使用LinearRegression训练模型;训练完成后,对测试集进行预测。记录模型学习到的特征权重与截距,并解释其业务含义。任务5模型评估(15分钟)计算MSE、MAE、R²三个指标,理解它们各自的侧重点:MSE惩罚大误差;MAE更鲁棒;R²越接近1表示模型拟合越好。任务6结果可视化(15分钟)绘制真实房价vs预测房价散点图,以及残差图,直观判断模型效果。参考代码以下为完整可运行代码。若图表中文显示为方框,请根据本地环境修改plt.rcParams中的字体名称:#实验二:基于线性回归的房价预测
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotasplt
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportStandardScaler
fromsklearn.linear_modelimportLinearRegression
fromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_score
#设置中文字体(根据本地环境选择合适字体)
plt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei','ArialUnicodeMS']
plt.rcParams['axes.unicode_minus']=False
#1.构造模拟房价数据集
np.random.seed(42)
n=500
data=pd.DataFrame({
"面积":np.random.uniform(50,200,n),
"卧室数":np.random.randint(1,6,n),
"距市中心距离":np.random.uniform(1,20,n),
"楼层":np.random.randint(1,30,n),
"房龄":np.random.uniform(0,40,n),
})
#真实房价(万元)=面积*3-距市中心距离*2-房龄*0.5+楼层*0.3+卧室数*5+噪声
noise=np.random.normal(0,15,n)
price=(
data["面积"]*3
-data["距市中心距离"]*2
-data["房龄"]*0.5
+data["楼层"]*0.3
+data["卧室数"]*5
+noise
)
X=data
y=price
feature_names=list(X.columns)
print("特征名称:",feature_names)
print("样本数:",X.shape[0])
print(X.describe().round(2))
#2.划分训练集与测试集
X_train,X_test,y_train,y_test=train_test_split(
X,y,test_size=0.2,random_state=42
)
#3.特征标准化(仅使用训练集参数)
scaler=StandardScaler()
X_train_scaled=scaler.fit_transform(X_train)
X_test_scaled=scaler.transform(X_test)
#4.训练线性回归模型
model=LinearRegression()
model.fit(X_train_scaled,y_train)
#5.预测
y_pred=model.predict(X_test_scaled)
#6.评估
mse=mean_squared_error(y_test,y_pred)
mae=mean_absolute_error(y_test,y_pred)
r2=r2_score(y_test,y_pred)
print(f"\nMSE={mse:.4f}")
print(f"MAE={mae:.4f}")
print(f"R²={r2:.4f}")
#输出模型参数
print("\n特征权重:")
forname,coefinzip(feature_names,model.coef_):
print(f"{name}:{coef:.4f}")
print(f"截距(偏置):{ercept_:.4f}")
#7.可视化
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.scatter(y_test,y_pred,alpha=0.5,edgecolors="none")
plt.plot([y_test.min(),y_test.max()],[y_test.min(),y_test.max()],"r--",lw=2)
plt.xlabel("真实房价(万元)")
plt.ylabel("预测房价(万元)")
plt.title("真实值vs预测值")
plt.subplot(1,2,2)
residuals=y_test-y_pred
plt.scatter(y_pred,residuals,alpha=0.5,edgecolors="none")
plt.axhline(0,color="r",linestyle="--")
plt.xlabel("预测房价(万元)")
plt.ylabel("残差")
plt.title("残差图")
plt.tight_layout()
plt.show()
预期结果(参考)运行代码后,你应看到类似以下的结果(具体数值因随机种子固定而一致):MSE=203.3851
MAE=11.4276
R²=0.9885
特征权重:
面积:135.6966
卧室数:7.5606
距市中心距离:-9.8135
楼层:1.5095
房龄:-5.1109
截距(偏置):365.6645结果解读:R²接近0.99,说明线性模型能很好地解释房价变异;面积系数为正且最大,说明面积是房价最重要的正向影响因素;距市中心距离和房龄系数为负,说明距离市中心越远、房龄越老,房价越低。结果记录表请将你的实验结果填入下表,用于撰写实验报告:项目数值含义解读MSE预测误差的平方均值MAE预测误差的绝对值均值R²模型解释数据变异的比例面积系数面积每增加1单位,房价平均变化多少距市中心距离系数距离每增加1单位,房价平均变化多少房龄系数房龄每增加1单位,房价平均变化多少五、实验重点、难点重点:线性回归的建模流程、训练集/测试集划分原则、回归评估指标(MSE/MAE/R²)的含义与计算。难点:理解特征标准化的必要性;理解模型系数的业务含义;识别线性假设的局限。六、操作要点建议在JupyterNotebook中按代码块逐步执行,每执行一步观察输出,确认无误后再进行下一步。训练集与测试集的划分应在使用StandardScaler之前完成,严禁先对整个数据集标准化再划分。特征标准化仅对数值特征进行,本实验所有特征均为数值型,因此可直接对整个特征矩阵标准化。若运行环境缺少中文字体,图表标签可能显示为方框,可尝试将plt.rcParams['font.sans-serif']中的字体改为本地可用字体。七、注意事项线性回归对异常值较为敏感,若加入极端样本,可能对模型参数产生较大影响。线性回归假设特征与目标之间近似线性相关;若关系明显非线性,预测效果会变差。评估指标仅反映模型在测试集上的表现,不能代表模型在所有真实场景中的可靠性。建模过程中应固定random_state,确保实验结果可复现。八、实验报告要求填写“结果记录表”,并解释各指标的含义。结合模型系数,说明哪些因素对房价影响最大、影响方向如何。观察真实值vs预测值散点图,判断模型拟合效果。思考题:如果将“房龄”替换为“房龄的平方”,模型会有什么变化?这说明了线性回归的什么局限?实验2基于逻辑回归的助学贷款还款风险预测一、实验目的及要求理解监督学习中分类任务的基本思想,能够区分分类任务与回归任务在目标形式上的差异。掌握逻辑回归模型的核心原理,理解Sigmoid函数如何将线性得分映射到(0,1)区间以表示概率。掌握分类任务的常用评价指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分数与混淆矩阵,并能够根据业务场景选择合适的指标。理解分类阈值对模型决策的影响,能够根据“宁可多预警,也不漏掉高风险”等业务需求调整阈值。树立负责任使用分类模型的意识,关注敏感特征可能带来的公平性与伦理风险。二、实验学时2学时(建议时间分配:讲解10分钟,任务实践80分钟,总结报告10分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Pandas、Matplotlib、scikit-learn。安装命令如下:pipinstallnumpypandasmatplotlibscikit-learn知识储备:已学习教材第4.3.1节(监督学习)与4.4.2节(逻辑回归),理解分类与回归的区别。四、实验任务任务1构造实验数据集(10分钟)参考教材表4-7,构造一个助学贷款还款风险数据集。每条样本包含:GPA(绩点)、家庭人均月收入(千元)、是否有兼职经历(0/1)、专业类型、贷款金额(万元)、是否按时还款(0/1)。任务2数据预处理(15分钟)将类别型特征“专业类型”进行独热编码;将数据集按8:2划分为训练集与测试集;对数值特征进行标准化处理。任务3训练逻辑回归模型(15分钟)使用LogisticRegression训练二分类模型。由于数据量较小,本实验使用solver='liblinear'以获得更稳定的收敛效果。输出模型系数,分析各特征对“按时还款概率”的影响方向。任务4模型评估(20分钟)计算准确率、精确率、召回率、F1分数,绘制混淆矩阵;结合资助中心的业务目标,解释不同指标的含义。任务5阈值调整实验(20分钟)改变分类阈值(如0.3、0.5、0.7),观察精确率与召回率的变化,绘制阈值—指标曲线,理解二者的权衡关系。参考代码以下为完整可运行代码。若图表中文显示为方框,请根据本地环境修改plt.rcParams中的字体名称:#实验三:基于逻辑回归的助学贷款还款风险预测
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotasplt
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportStandardScaler
fromsklearn.linear_modelimportLogisticRegression
fromsklearn.metricsimport(
accuracy_score,precision_score,recall_score,f1_score,
confusion_matrix,classification_report
)
#设置中文字体
plt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei','ArialUnicodeMS']
plt.rcParams['axes.unicode_minus']=False
#1.构造数据集
np.random.seed(42)
n=300
data=pd.DataFrame({
"GPA":np.round(np.random.uniform(2.0,4.5,n),2),
"家庭人均月收入":np.round(np.random.uniform(3,15,n),1),
"是否有兼职":np.random.randint(0,2,n),
"专业类型":np.random.choice(["理工","文史","经管"],n),
"贷款金额":np.round(np.random.uniform(1,5,n),1),
})
#生成标签:加入随机噪声,使任务更接近真实场景
score=(
0.6*data["GPA"]
+0.08*data["家庭人均月收入"]
+0.25*data["是否有兼职"]
-0.05*data["贷款金额"]
+np.random.normal(0,0.5,n)
)
data["是否按时还款"]=(score>score.median()).astype(int)
print("数据集样本量:",data.shape[0])
print("按时还款分布:\n",data["是否按时还款"].value_counts())
#2.独热编码
X=pd.get_dummies(data.drop("是否按时还款",axis=1),columns=["专业类型"],drop_first=True)
y=data["是否按时还款"]
#3.划分与标准化
X_train,X_test,y_train,y_test=train_test_split(
X,y,test_size=0.2,random_state=42
)
scaler=StandardScaler()
num_cols=["GPA","家庭人均月收入","贷款金额"]
X_train[num_cols]=scaler.fit_transform(X_train[num_cols])
X_test[num_cols]=scaler.transform(X_test[num_cols])
#4.训练逻辑回归(使用liblinear求解器,适合小数据集)
model=LogisticRegression(random_state=42,solver='liblinear')
model.fit(X_train,y_train)
#5.预测与评估
y_pred=model.predict(X_test)
y_prob=model.predict_proba(X_test)[:,1]
print("\n混淆矩阵:")
print(confusion_matrix(y_test,y_pred))
print("\n分类报告:")
print(classification_report(y_test,y_pred,target_names=["未按时","按时"]))
print(f"准确率:{accuracy_score(y_test,y_pred):.4f}")
print(f"精确率:{precision_score(y_test,y_pred):.4f}")
print(f"召回率:{recall_score(y_test,y_pred):.4f}")
print(f"F1分数:{f1_score(y_test,y_pred):.4f}")
#输出特征系数
print("\n特征系数(系数越大,对“按时还款”的正面影响越强):")
forname,coefinzip(X.columns,model.coef_[0]):
print(f"{name}:{coef:.4f}")
#6.阈值调整实验
thresholds=np.arange(0.1,0.95,0.05)
precisions,recalls,f1s=[],[],[]
fortinthresholds:
pred_t=(y_prob>=t).astype(int)
precisions.append(precision_score(y_test,pred_t,zero_division=0))
recalls.append(recall_score(y_test,pred_t,zero_division=0))
f1s.append(f1_score(y_test,pred_t,zero_division=0))
plt.figure(figsize=(8,5))
plt.plot(thresholds,precisions,label="精确率",marker="o")
plt.plot(thresholds,recalls,label="召回率",marker="s")
plt.plot(thresholds,f1s,label="F1",marker="^")
plt.xlabel("分类阈值")
plt.ylabel("指标值")
plt.title("不同阈值下的精确率、召回率与F1")
plt.legend()
plt.grid(True)
plt.show()
预期结果(参考)运行代码后,你应看到类似以下的结果:混淆矩阵:
[[198]
[825]]
分类报告:
precisionrecallf1-scoresupport
未按时0.700.700.7027
按时0.760.760.7633
准确率:0.7333
精确率:0.7576
召回率:0.7576
F1分数:0.7576
特征系数:
GPA:1.2980
家庭人均月收入:0.6882
是否有兼职:0.9808
贷款金额:-0.0797
专业类型_理工:-0.2060
专业类型_经管:0.1309结果解读:准确率约为0.73,说明模型在测试集上能正确识别约73%的学生;GPA、家庭收入、兼职经历系数为正,说明这些因素有助于按时还款;贷款金额系数为负,说明贷款金额越高,还款风险越大。结果记录表请将你的实验结果填入下表:项目数值业务含义准确率所有预测中正确的比例精确率预测为“按时”的样本中真正按时还款的比例召回率真正按时还款的样本中被正确识别的比例F1分数精确率与召回率的调和平均最重要的正向特征对按时还款促进作用最大的特征最重要的负向特征对按时还款抑制作用最大的特征五、实验重点、难点重点:逻辑回归“线性组合+Sigmoid映射”的模型结构、分类评估指标的含义与计算、混淆矩阵的解读。难点:理解概率阈值的选择如何影响精确率与召回率的权衡;理解逻辑回归系数的方向与大小对业务决策的解释意义。六、操作要点类别型特征必须进行独热编码,不能直接输入模型。建议先使用默认阈值0.5得到基线结果,再根据不同业务目标调整阈值。若数据类别不平衡,应重点关注F1分数与混淆矩阵,而非单一的准确率。实验结束后,思考“是否应该将性别、家庭住址等敏感属性作为特征”,并在报告中说明理由。七、注意事项逻辑回归默认带有L2正则化,特征量纲差异较大时务必先标准化。精确率与召回率往往此消彼长,需结合具体业务场景进行取舍。本实验数据为模拟生成,仅用于教学演示,真实场景中应使用经脱敏处理的真实业务数据。避免将模型的概率输出直接等同于事件发生的“真实概率”。八、实验报告要求填写“结果记录表”,并解释混淆矩阵中TP、TN、FP、FN的含义。结合阈值调整曲线,说明:若资助中心希望“宁可多预警,也不漏掉高风险学生”,应选择较大还是较小的阈值?为什么?分析模型系数,说明哪些因素会降低还款风险、哪些因素会升高还款风险。思考题:如果数据集中“按时还款”与“未按时还款”的样本比例严重失衡(例如9:1),准确率是否还能可靠地反映模型性能?应如何处理?实验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.colum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育运动公司客户服务规范
- 市政基础设施工程临时用电专项施工方案
- 驻马店确山县招聘教师考试真题2025
- 海绵城市项目施工验收标准手册
- 工程咨询企业全过程咨询操作手册
- 风电场土建工程施工方案
- 废弃油脂制可持续航空燃料项目绩效评价
- 2027届沧州市海兴县数学三年级第一学期期末调研试题含解析
- 2027届辽宁省抚顺市顺城区数学四年级第一学期期末达标检测模拟试题含解析
- 幼儿园的一天读书心得
- 注册会计师考试2025年平台经济对会计的挑战与策略试题及答案
- 小学生班级管理培训课件
- 蔬菜采购述职报告
- 2025陕西延长石油(集团)有限责任公司招聘(1881人)笔试备考题库及答案解析
- CJT 514-2018 燃气输送用金属阀门
- 广东省深圳市罗湖区2023-2024学年八年级下学期期末考试英语试题
- 个人防护装备的使用培训
- 2024年T+产品历年考试高频考点试题附带答案
- 展厅升级改造方案
- (新版)驾照科目一必备考试题库500题(含答案)
- FLUKE1550C电子兆欧表使用介绍
评论
0/150
提交评论