一、实验概述本实验基于 Python 语言使用Streamlit框架开发了一个交互式数据科学与机器学习综合学习平台。平台涵盖了 Python 基础语法、NumPy 数值计算、Pandas 数据处理、Matplotlib 数据可视化、缺失值处理与数据变换、机器学习经典算法、集成学习以及 TensorFlow 深度学习等八个教学章节。通过侧边栏导航、交互式控件滑块、按钮、选择框和动态图表为用户提供可操作、可视化的学习体验降低数据科学入门门槛。二、功能模块详解模块 1环境配置与初始化pythonimport streamlit as st import pandas as pd import numpy as np import matplotlib.pyplot as plt import warnings import os from typing import Callable, Dict # 解决 Matplotlib 中文显示问题 plt.rcParams[font.sans-serif] [WenQuanYi Zen Hei, SimHei, Microsoft YaHei, Noto Sans CJK SC] plt.rcParams[axes.unicode_minus] False warnings.filterwarnings(ignore) st.set_page_config( page_title综合学习平台 - 交互式数据科学与机器学习, page_icon, layoutwide, initial_sidebar_stateexpanded )代码解释导入 Streamlit 构建 Web 界面Pandas/NumPy 处理数据Matplotlib 绘图。通过plt.rcParams设置中文字体解决图表中文乱码问题忽略警告保持界面整洁配置页面标题、图标、宽屏布局和侧边栏展开状态。使用原因跨平台中文字体支持确保图表在任何操作系统下均能正常显示宽屏布局适合展示多图表对比全局配置为后续所有章节提供统一的基础环境。模块 2会话状态管理与章节管理器pythonif chapter_state not in st.session_state: st.session_state.chapter_state {} def reset_chapter_state(chapter: str): if chapter in st.session_state.chapter_state: del st.session_state.chapter_state[chapter] class ChapterManager: def __init__(self): self.chapter_mapping: Dict[str, Callable] { 第一章Python基础语法: self.chapter1_python_basics, 第二章NumPy数值计算: self.chapter2_numpy, # ... 其他章节 } self.source_files { ... } # 原始代码文件映射 def _read_source_file(self, chapter_name): filename self.source_files.get(chapter_name) if filename and os.path.exists(filename): with open(filename, r, encodingutf-8) as f: return f.read() return f# 未找到文件{filename}代码解释使用 Streamlit 的session_state存储每个章节的临时状态如用户输入、计算结果。ChapterManager类通过字典映射章节名称到对应的展示方法并维护各章节原始代码文件的路径。_read_source_file方法读取外部.py文件供用户查看完整源码。运行逻辑用户选择章节后main()调用manager.run_chapter(selected)根据映射执行对应方法。每个章节方法内部调用_read_source_file以可展开区块展示原始代码同时提供交互式控件和动态可视化。重置按钮可清除特定章节的缓存状态。使用原因将章节逻辑封装为独立方法便于维护和扩展外部源码文件展示方便教学对比session_state保证交互过程中数据不丢失。模块 3第一章 – Python 基础语法pythondef chapter1_python_basics(self): st.subheader(Python 基础语法, dividerred) with st.expander( 查看本章核心代码原始文件, expandedTrue): code self._read_source_file(第一章Python基础语法) st.code(code, languagepython) col1, col2 st.columns(2) with col1: a st.number_input(输入整数 a, value10, step1) b st.number_input(输入整数 b, value20, step1) if st.button(计算 a b): st.success(f{a} {b} {ab}) with col2: n st.slider(生成 0 到 n 的平方, 1, 20, 10) squares [i**2 for i in range(n1)] st.write(f0 到 {n} 的平方{squares}) # 函数可视化 x_vals np.linspace(-2, 6, 100) y_vals x_vals**2 - 4*x_vals 3 fig, ax plt.subplots() ax.plot(x_vals, y_vals) st.pyplot(fig)代码解释该章节展示 Python 基础语法整数运算、列表推导式、字符串切片、函数定义与绘图。使用两列布局左侧提供数字输入和加法按钮右侧演示列表推导式底部绘制二次函数f(x)x²-4x3的曲线。运行逻辑用户可在左侧输入 a、b 并点击按钮即时显示加法结果右侧滑动滑块改变 n动态生成平方列表绘图部分无需交互直接展示函数图像。使用原因通过实际可操作的例子让初学者理解变量、运算符、列表推导式和函数调用可视化加深对函数形状的认识为后续数据处理打下基础。模块 4第二章 – NumPy 数值计算pythondef chapter2_numpy(self): A np.array([[1,2],[3,4]]) B np.array([[5,6],[7,8]]) scalar st.slider(标量乘法因子, 0.0, 5.0, 2.0, step0.1) st.write(fA * {scalar} , A * scalar) op st.selectbox(选择运算, [加法, 减法, 元素乘法, 矩阵乘法]) if op 加法: result A B elif op 减法: result A - B elif op 元素乘法: result A * B else: result A B st.write(结果, result) if st.button(计算行列式): st.write(f行列式: {np.linalg.det(A):.4f})代码解释演示 NumPy 数组的基本运算标量乘法、矩阵加/减/乘/点乘以及线性代数操作行列式、特征值。用户通过滑块调整标量因子通过下拉框选择运算类型点击按钮计算行列式。运行逻辑页面显示固定矩阵 A 和 B用户交互后实时计算并显示结果。矩阵乘法使用运算符元素乘法使用*。使用原因直观展示 NumPy 的向量化运算优势对比元素乘法与矩阵乘法的区别线性代数功能行列式、特征值为机器学习中的矩阵分解等概念提供前置知识。模块 5第三章 – Pandas 数据处理可视化优化版pythondef chapter3_pandas(self): df pd.DataFrame({ 姓名: [张三,李四,王五,赵六], 年龄: [25, np.nan, 30, 28], 工资: [5000, 6000, np.nan, 5500] }) option st.selectbox(选择操作, [填充缺失值, 删除缺失行, 描述统计, 分组聚合]) if option 填充缺失值: method st.radio(填充方法, [均值, 中位数, 常数0]) # ... 填充逻辑 # 优化后的可视化 before df[工资].dropna() after df_filled[工资] x_min min(before.min(), after.min()) - 500 x_max max(before.max(), after.max()) 500 bins max(5, int(np.ceil(np.log2(len(before)) 1))) fig, axes plt.subplots(1, 2, figsize(12,5)) axes[0].hist(before, binsbins, colorsteelblue, edgecolorblack) axes[0].set_title(填充前工资分布) axes[0].set_xlabel(工资 (元)); axes[0].set_ylabel(频数) axes[1].hist(after, binsbins, colorseagreen, edgecolorblack) axes[1].set_title(填充后工资分布) axes[1].set_xlabel(工资 (元)); axes[1].set_ylabel(频数) st.pyplot(fig)代码解释创建包含缺失值的 DataFrame提供缺失值处理选项均值/中位数/常数填充。优化后的可视化模块统一了两张直方图的 X 轴范围动态计算 bins 数量添加轴标签和标题使填充前后的工资分布对比更清晰。运行逻辑用户选择填充方法后程序生成填充后的 DataFrame并绘制两个并排直方图。左图显示原始有效工资分布右图显示填充后分布底部附加统计信息样本数、均值。使用原因缺失值处理是数据清洗的核心技能优化后的图表解决了原版无标签、范围不一致的问题更符合数据可视化最佳实践帮助用户直观理解填充方法对数据分布的影响。模块 6第六章 – 机器学习经典算法pythondef chapter6_machine_learning(self): from sklearn.datasets import load_iris, load_diabetes from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, LogisticRegression from sklearn.svm import SVC from sklearn.cluster import KMeans algo st.selectbox(选择算法, [线性回归糖尿病, 逻辑回归鸢尾花, ...]) if algo 线性回归糖尿病: data load_diabetes() X_train, X_test, y_train, y_test train_test_split(data.data, data.target) lr LinearRegression().fit(X_train, y_train) st.write(fR²: {lr.score(X_test, y_test):.4f}) # 绘制真实值 vs 预测值散点图 elif algo 逻辑回归鸢尾花: C st.slider(正则化强度 C, 0.01, 10.0, 1.0) model LogisticRegression(CC) # ... 训练并输出准确率代码解释集成 scikit-learn 中的经典算法线性回归糖尿病数据集、逻辑回归、MLP、SVM 和 KMeans 聚类鸢尾花数据集。用户可通过滑块调整超参数如正则化强度、隐藏层神经元数、聚类数实时查看模型性能R²、准确率、调整兰德指数。运行逻辑选择算法后自动加载对应数据集划分训练/测试集使用当前超参数训练模型并在界面上显示评估指标和可视化图表如回归的预测散点图、聚类的散点图。使用原因让学习者在实践中体会不同算法的特点和超参数的影响提供基准数据集鸢尾花、糖尿病降低数据准备门槛交互式调整超参数加深对模型容量的理解。模块 7第八章 – TensorFlow 深度学习案例pythondef chapter8_tensorflow(self): import tensorflow as tf TRUE_W, TRUE_B 3.0, 1.0 n_samples st.slider(样本数量, 50, 500, 200) noise_std st.slider(噪声标准差, 0.0, 1.0, 0.5) x tf.random.normal(shape[n_samples]) y TRUE_W * x TRUE_B tf.random.normal(shape[n_samples]) * noise_std learning_rate st.slider(学习率, 0.01, 0.5, 0.1) epochs st.slider(训练轮数, 50, 500, 100) class LinearModel(tf.Module): def __init__(self): self.W tf.Variable(5.0) self.b tf.Variable(0.0) def __call__(self, x): return self.W * x self.b model LinearModel() optimizer tf.optimizers.SGD(learning_rate) # 训练循环并使用 st.progress 显示进度 if st.button(开始训练): for epoch in range(epochs): with tf.GradientTape() as tape: loss tf.reduce_mean(tf.square(model(x) - y)) grads tape.gradient(loss, [model.W, model.b]) optimizer.apply_gradients(zip(grads, [model.W, model.b])) st.success(f训练完成: W{model.W.numpy():.3f}, b{model.b.numpy():.3f}) # 绘制损失曲线和拟合直线代码解释使用 TensorFlow 2.x 构建线性回归模型从真实参数W3, b1生成带噪声的合成数据。用户可调整样本量、噪声、学习率和训练轮数点击按钮后训练模型并显示损失下降曲线和拟合直线。运行逻辑数据生成 → 模型定义可训练变量 W、b→ SGD 优化器 → 梯度带计算损失 → 更新参数 → 训练结束后可视化结果。训练过程中显示进度条。使用原因轻量级深度学习入门案例无需 GPU 即可运行通过合成数据让用户清晰理解梯度下降过程和过拟合/欠拟合通过调整噪声和学习率观察进度条提升交互体验。模块 8主程序与侧边栏导航pythondef main(): st.sidebar.title( 综合学习平台) st.sidebar.markdown(### 导航) manager ChapterManager() selected st.sidebar.selectbox(选择章节, manager.get_chapters()) if st.sidebar.button( 重置当前章节状态): reset_chapter_state(selected) st.sidebar.success(状态已重置) st.title(f {selected}) manager.run_chapter(selected) st.markdown(div classfooter© 2026 综合学习平台/div, unsafe_allow_htmlTrue) if __name__ __main__: main()代码解释main()构建侧边栏导航包含章节选择下拉框和重置按钮。根据用户选择的章节调用ChapterManager.run_chapter()渲染内容。页面底部显示版权信息。运行逻辑启动应用后侧边栏显示所有章节默认选中第一章。用户切换章节时页面主体动态更新为对应章节的交互内容。点击重置按钮可清除该章节的会话状态如已计算的中间结果。使用原因Streamlit 的侧边栏提供清晰的导航结构重置功能避免状态累积导致的意外行为模块化设计使得添加新章节只需在chapter_mapping中注册新方法。模块 7补充第四章 – Matplotlib 数据可视化pythondef chapter4_matplotlib(self): plot_type st.selectbox(选择图表, [正弦曲线可调参数, 二次函数与直线, 销售额趋势, 子图综合]) if plot_type 正弦曲线可调参数: freq st.slider(频率, 0.5, 5.0, 1.0, step0.5) amp st.slider(幅度, 0.5, 3.0, 1.0, step0.1) x np.linspace(0, 4*np.pi, 200) y amp * np.sin(freq * x) fig, ax plt.subplots() ax.plot(x, y) ax.set_title(fy {amp} * sin({freq} x)) st.pyplot(fig) elif plot_type 二次函数与直线: x np.linspace(0,1,100) fig, ax plt.subplots() ax.plot(x, x**2, labelyx²) ax.plot(x, x, labelyx) ax.legend() st.pyplot(fig) elif plot_type 销售额趋势: quarters [Q1,Q2,Q3,Q4] sales [100,104,106,95] fig, ax plt.subplots() ax.plot(quarters, sales, markero) ax.set_ylabel(销售额(万元)) st.pyplot(fig) else: # 子图综合 fig, axes plt.subplots(2,2,figsize(10,8)) x np.linspace(0,2*np.pi,100) axes[0,0].plot(x, np.sin(x)); axes[0,0].set_title(sin) axes[0,1].hist(np.random.randn(1000), bins30); axes[0,1].set_title(直方图) axes[1,0].scatter(np.random.randn(50), np.random.randn(50)); axes[1,0].set_title(散点图) axes[1,1].bar([A,B,C],[3,7,5]); axes[1,1].set_title(柱状图) plt.tight_layout() st.pyplot(fig)代码解释本章提供四种交互式绘图选项正弦曲线可调参数用户通过滑块调节频率和幅度实时生成动态正弦波直观理解参数对波形的影响。二次函数与直线在同一坐标系中绘制 yx² 和 yx展示非线性与线性函数的差异。销售额趋势模拟季度销售额数据绘制带标记的折线图展示时间序列数据的常见可视化方式。子图综合一次性生成 2×2 子图分别展示正弦曲线、直方图、散点图和柱状图帮助用户掌握多子图布局技巧。运行逻辑用户在下拉框中选择图表类型后页面动态显示对应的控件和绘图区域。正弦曲线支持频率/幅度调节其他类型为固定示例。所有图表均使用 Matplotlib 绘制并通过st.pyplot渲染。使用原因数据可视化是数据分析的关键环节。本章通过可交互的示例让学习者掌握折线图、散点图、直方图、柱状图等基础图形的绘制方法同时理解参数调整对图形的影响为后续章节中自定义图表如第三章直方图优化打下基础。模块 8补充第五章 – 缺失值处理与数据变换pythondef chapter5_missing_values(self): from sklearn.impute import SimpleImputer, KNNImputer from sklearn.preprocessing import StandardScaler, MinMaxScaler data np.array([ [1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [2, 5, 9], [np.nan, 3, 4] ]) st.dataframe(pd.DataFrame(data)) method st.selectbox(插补方法, [均值插补, 中位数插补, KNN插补]) if method 均值插补: imputer SimpleImputer(strategymean) elif method 中位数插补: imputer SimpleImputer(strategymedian) else: imputer KNNImputer(n_neighbors2) if st.button(执行插补): st.session_state.imputed_data imputer.fit_transform(data) if st.session_state.imputed_data is not None: result st.session_state.imputed_data st.dataframe(pd.DataFrame(result)) # 热力图对比 fig, axes plt.subplots(1,2, figsize(10,4)) im1 axes[0].imshow(data, cmapviridis, interpolationnearest) axes[0].set_title(原始数据NaN为空白) im2 axes[1].imshow(result, cmapviridis, interpolationnearest) axes[1].set_title(插补后数据) plt.colorbar(im1, axaxes[0]) plt.colorbar(im2, axaxes[1]) st.pyplot(fig) # 数据变换标准化/归一化 scale_opt st.radio(选择变换方法, [无, 标准化 (Z-score), 归一化 (Min-Max)]) if st.button(应用变换): if scale_opt 标准化: transformed StandardScaler().fit_transform(result) elif scale_opt 归一化: transformed MinMaxScaler().fit_transform(result) else: transformed result st.dataframe(pd.DataFrame(transformed))代码解释本章专注于数据预处理中的缺失值处理和特征变换。缺失值插补提供均值插补、中位数插补、KNN 插补三种方法。用户点击按钮后使用sklearn.impute中的相应类对 5×3 的示例矩阵进行填充并展示填充前后的数值对比热力图。数据变换在插补结果的基础上用户可选择标准化Z-score或归一化Min-Max点击按钮后应用变换并显示结果。运行逻辑页面首先显示含 NaN 的原始矩阵。用户选择插补方法后点击“执行插补”程序将结果存入session_state.imputed_data然后展示插补后的数据矩阵和热力图对比。接着用户可选择变换方法并点击“应用变换”显示最终变换结果。使用原因缺失值处理和特征缩放是机器学习数据预处理的必备技能。通过交互式示例学习者能直观对比不同插补策略的效果热力图颜色变化可清晰看到 NaN 被填充理解标准化与归一化的区别标准化使数据均值为 0、方差为 1归一化将数据缩放到 [0,1] 区间。本章为后续机器学习章节的数据准备环节提供了实践基础。模块 9补充第七章 – 集成学习算法pythondef chapter7_ensemble(self): from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier from sklearn.metrics import accuracy_score import xgboost as xgb data load_iris() X_train, X_test, y_train, y_test train_test_split(data.data, data.target, random_state42) algo st.selectbox(选择集成方法, [随机森林, AdaBoost, GBDT, XGBoost]) if algo 随机森林: n_estimators st.slider(树的数量, 10, 200, 100, step10) model RandomForestClassifier(n_estimatorsn_estimators, random_state42) elif algo AdaBoost: n_estimators st.slider(弱学习器数量, 10, 200, 50, step10) model AdaBoostClassifier(n_estimatorsn_estimators, random_state42) elif algo GBDT: n_estimators st.slider(迭代次数, 10, 200, 100, step10) learning_rate st.slider(学习率, 0.01, 1.0, 0.1, step0.05) model GradientBoostingClassifier(n_estimatorsn_estimators, learning_ratelearning_rate, random_state42) else: # XGBoost n_estimators st.slider(树的数量, 10, 200, 100, step10) learning_rate st.slider(学习率, 0.01, 0.5, 0.1, step0.05) model xgb.XGBClassifier(n_estimatorsn_estimators, learning_ratelearning_rate, use_label_encoderFalse, eval_metriclogloss, random_state42) if st.button(训练并评估): model.fit(X_train, y_train) acc accuracy_score(y_test, model.predict(X_test)) st.success(f测试集准确率: {acc:.4f}) if hasattr(model, feature_importances_): st.write(特征重要性:, model.feature_importances_) fig, ax plt.subplots() ax.barh(data.feature_names, model.feature_importances_) ax.set_xlabel(重要性) st.pyplot(fig)代码解释本章聚焦集成学习中的四种主流算法随机森林、AdaBoost、梯度提升树GBDT和 XGBoost。所有模型均在鸢尾花数据集上进行分类任务。随机森林用户可调整决策树的数量。AdaBoost用户可调整弱学习器的数量。GBDT可同时调整迭代次数和学习率。XGBoost同样可调整树的数量和学习率并设置eval_metriclogloss。点击“训练并评估”按钮后模型训练并在测试集上输出准确率若模型支持特征重要性如随机森林、XGBoost则绘制水平条形图展示每个特征的重要性。运行逻辑用户选择集成方法并调整超参数后点击训练按钮程序使用当前超参数训练模型计算测试集准确率并显示特征重要性图表。使用原因集成学习通常比单一模型具有更好的泛化能力。通过对比不同集成方法Bagging 的随机森林 vs Boosting 的 AdaBoost/GBDT/XGBoost在同一数据集上的表现学习者可以理解集成策略的原理和超参数的影响。特征重要性可视化帮助解释模型决策是机器学习可解释性的重要手段。三、系统运行逻辑系统采用事件驱动 回调的模块化架构整体运行流程如下启动阶段执行st.set_page_config配置页面。初始化 Matplotlib 中文字体。创建session_state中的章节状态字典。渲染侧边栏main()实例化ChapterManager获取章节列表。生成下拉框和重置按钮监听用户选择。用户交互循环用户选择章节后manager.run_chapter(selected)调用对应方法如chapter3_pandas。该方法内部以st.expander展示原始代码文件若存在。渲染交互控件滑块、按钮、选择框。根据用户输入动态计算数据如填充缺失值、训练模型。使用matplotlib生成图表并通过st.pyplot显示。用户修改控件值或点击按钮时Streamlit 自动从上到下重新执行脚本更新输出。状态管理重要中间结果如插补后的数据、训练好的模型存储在st.session_state中避免重复计算。重置按钮删除对应章节的缓存条目强制重新计算。异常处理第八章尝试导入 TensorFlow若失败则显示错误提示并跳过训练。文件读取时若找不到对应.py文件显示提示信息但不中断其他功能。四、优化建议与总结可优化方向问题建议每次交互都重新训练模型第六章、第七章使用st.cache_resource缓存训练好的模型仅当超参数改变时重新训练。各章节方法代码臃肿50~80 行将每个章节拆分为独立模块文件通过动态导入实现按需加载。TensorFlow 训练无进度条已实现st.progress可进一步显示实时损失值。缺少用户自定义数据上传增加st.file_uploader让用户替换内置数据集如鸢尾花。部分章节重复设置中文字体已在全局设置一次第三章内部重复设置可删除。总结本综合学习平台成功将数据科学核心知识点转化为可交互的 Web 应用覆盖了从 Python 基础到深度学习入门的主要教学内容。通过 Streamlit 的快速开发能力和模块化设计平台具有良好的可扩展性可轻松增加第九章自然语言处理。可视化优化如第三章直方图和中文支持显著提升了用户体验为教学演示和自学提供了有力工具。后续可围绕性能优化、用户数据上传和模型持久化进一步迭代。屏幕录制 2026-04-12 181010