GitHub,一个交互式的机器学习实验平台!
powershell
git clone https://github.com/patrickloeber/streamlit-demo
pip install -r requirements.txt
streamlit run main.py
用户可以像玩游戏一样,在浏览器里随意切换数据集、切换分类器、调整模型参数,然后立刻看到准确率和数据在二维空间的可视化散点图。
短短 80 多行代码,就做出了一个小型的"机器学习模型对比工具",特别适合教学、演示或快速实验。太强大了!
1. 开头导入库
python
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
- 导入 Streamlit(做网页)、NumPy(处理数字)、Matplotlib(画图)
- 从 scikit-learn(sklearn)导入:
- 三个经典数据集
- 三个常用分类器:SVM、KNN、随机森林
- 工具:数据拆分、PCA降维、准确率计算
2. 页面标题和说明
python
st.title('Streamlit 例子')
st.write(""" # 探索不同的分类器和数据集 ... """)
- 大标题 + 一段说明文字,告诉用户:你可以试不同数据集和分类器,看哪个最好!
侧边栏:让用户选择数据集和分类器(核心交互!)
python
dataset_name = st.sidebar.selectbox('选择数据集', ('Iris', 'Breast Cancer', 'Wine'))
classifier_name = st.sidebar.selectbox('选择分类器', ('KNN', 'SVM', 'Random Forest'))
- 所有选择都放在左侧侧边栏(sidebar),界面更整洁。
- 用户可以选三个经典数据集:
- Iris(鸢尾花,简单经典)
- Breast Cancer(乳腺癌诊断)
- Wine(葡萄酒分类)
- 可以选三个分类器:KNN、SVM、随机森林
4. 加载用户选择的数据集
python
def get_dataset(name):
if name == 'Iris': data = datasets.load_iris()
elif name == 'Wine': data = datasets.load_wine()
else: data = datasets.load_breast_cancer()
X = data.data # 特征(输入)
y = data.target # 标签(输出:类别)
return X, y
X, y = get_dataset(dataset_name)
- 根据用户选择,加载对应数据。
- 显示数据集形状(多少样本、多少特征)和类别数量。
5. 侧边栏:根据分类器显示不同的参数调节滑块
python
def add_parameter_ui(clf_name):
params = dict()
if clf_name == 'SVM':
C = st.sidebar.slider('C', 0.01, 10.0) # SVM 的正则化参数
params['C'] = C
elif clf_name == 'KNN':
K = st.sidebar.slider('K', 1, 15) # 邻居数量
params['K'] = K
else: # Random Forest
max_depth = st.sidebar.slider('max_depth', 2, 15)
n_estimators = st.sidebar.slider('n_estimators', 1, 100)
params['max_depth'] = max_depth
params['n_estimators'] = n_estimators
return params
- 超级聪明的一招!根据你选的分类器,自动在侧边栏显示对应的可调参数:
- SVM → 调 C(控制模型复杂度)
- KNN → 调 K(邻居数)
- 随机森林 → 调树深度和树的数量
6. 根据选择和参数创建分类器模型
python
def get_classifier(clf_name, params):
if clf_name == 'SVM':
clf = SVC(C=params['C'])
elif clf_name == 'KNN':
clf = KNeighborsClassifier(n_neighbors=params['K'])
else:
clf = RandomForestClassifier(n_estimators=..., max_depth=..., random_state=1234)
return clf
clf = get_classifier(classifier_name, params)
- 用用户调好的参数,实例化对应的模型。
7. 训练 + 测试 + 计算准确率
python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
st.write(f'Classifier = {classifier_name}')
st.write(f'Accuracy =', acc)
- 把数据分成训练集(80%)和测试集(20%)
- 用训练集训练模型
- 用测试集预测
- 计算准确率并显示出来
- → 你调参数的时候,准确率会实时变化!
python
pca = PCA(2)
X_projected = pca.fit_transform(X)
x1 = X_projected[:, 0]
x2 = X_projected[:, 1]
fig = plt.figure()
plt.scatter(x1, x2, c=y, alpha=0.8, cmap='viridis')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.colorbar()
st.pyplot(fig)
- 因为原始数据可能是高维的(比如 Wine 有 13 个特征),人眼看不了。
- 用 PCA(主成分分析)把所有特征压缩成 2 个主成分。
- 画散点图:横轴是第一主成分,纵轴是第二主成分,颜色表示不同类别。
- 颜色条显示类别对应关系。
- 最后用 st.pyplot(fig) 显示这张图。
你运行后会看到什么样子?
启动命令:streamlit run main.py
浏览器里会出现一个漂亮的网页:
-
左边侧边栏:
- 选数据集
- 选分类器
- 对应的参数滑块(自动切换!)
-
主页面:
- 显示当前数据集信息(形状、类别数)
- 显示当前分类器和实时准确率
- 一张彩色的散点图,展示数据在二维空间的分布(不同类别用不同颜色)
你随便调滑块、换模型、换数据集,所有结果立刻刷新,完全不用重启!
这个应用牛在哪儿?
- 零前端代码,全 Python 实现
- 高度交互:用户可以像玩玩具一样实验机器学习
- 实时反馈:调参数马上看到准确率变化
- 教育价值极高:特别适合初学者理解"不同模型在不同数据上的表现"
总之,这个例子已经是非常优秀的 Streamlit + 机器学习结合案例了!你学到这里,已经能做出真正有用的数据应用了!
感谢老马的grok,学再多不如自己动手实践。
