学习代码记录仓库
使用Jupyter Lab测试执行代码验证。
Scikit-learn
Scikit-learn是一个开源机器学习库,支持监督学习和非监督学习。它提供了模型拟合、数据预处理、模型选择、评估等一站式工具。
安装的观点是,
pip install scikit-learn
主要概念这方面,训练集 / 验证集 / 测试集
把数据分成三份。各司其职:
数据集├── 训练集 → 用来训练模型
├── 验证集 → 用来调参选模型
└── 测试集 → 最终评估
为什么要分? 就像前端不能用单元测试的数据来验收功能。模型也不能用训练数据来评估效果,否则会“作弊”。
使用train_test_split对数据进行划分,按照上述比例分割:
from sklearn.model_selection import train_test_split
# 特征 X 比如年龄、性别等,除了标签之外的X = df.drop
# 标签 Y 就是是否存活
y = df
# 划分训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(
X,y,test_size=0.2。random_state=42,stratify=y
)
# 划分训练集和验证集
X_train,X_val,y_train,y_val = train_test_split(
X_train,y_train,test_size=0.25,random_state=42,stratify=y_train
)
# 最终比例:60% 训练,20% 验证,20% 测试
random_state : 随机数种子,让实验可复现。
stratify : 对类别进行分层,保证每份中类别比例相同。
说到特征工程,让原始数据更友好给模型吃饭
. 类别特征编码:把文字变成数字。让模型能识别
再看常见两种方式,
标签编码: 适用于有序或二值特征,例如性别。
独热编码: 适用于无序类别,例如港口 S/C/Q。
# 删除无意义列
df = df.drop
# 标签编码示例
df = df.map
# 独热编码示例
df = pd.get_dummies
. 特征缩放:统一量纲,让距离计算更公平
SVC / LR / KNN 等线性/距离相关算法需要缩放;树模型不需要,
Z-score 标准化 :均值0、方差1;在大多数情况下首选,
Mín-Max 缩放 :将值压到 区间;适合像像素那样固定范围的数据。
RobustScaler:基于中位数和四分位距,对极端值更稳健。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler
X_train_scaled = scaler.fit_transform
X_test_scaled = scaler.transform
. 特征选择:筛掉冗余。让模型更快更稳健
再看方法,
相关性热力图;但只捕捉线性关系,Pain Point: "我发现某些特征相关度很高,但模型表现却很差" .
基于树模型的关键性评分。如 RandomForest 的 feature_importances_.
Pain Point: "不知道哪些特征真正有用" .
递归特征消除 或 L1 正则化等方法,但要先训练模型。说起来,
过拟合 & 欠拟合——如何识别与修正?说起来,
模型太简单;模型记住了训练噪声而泛化差。如何判断,准确率即可的观点是,
train_score = model.score
test_score = model.score
print
print
if train_score - test_score> 0.1:
print
elif abs <0.05:
print
else:
print
Pain Point: Description: Solve With:
Lack of Regularization Knowledge
→ Model keeps memorizing training set. Add regularization term C in LogisticRegression or Ridge/Lasso. `LogisticRegression` 或 `Ridge`.
No Data Augmentation
→ Small dataset leads to overfit. Add more samples or use cross‑validation. `cross_val_score` + `StratifiedKFold`.
No Hyper‑parameter Tuning
→ Default hyper‑parameters are suboptimal. `GridSearchCV` 或 `RandomizedSearchCV` 自动搜索最佳参数组合。
Lack of Validation Set
→ Only test set used for tuning leads to optimistic results. Create a separate validation set or rely on cross‑validation.
Dropped Features Without Reason
→ Removing useful info reduces performance.- Ensure you keep all informative features before scaling/encoding.
- Re‑evaluate feature importance after preprocessing.
常见坑汇总表 – 学习时务必留意!按理说,
模型评估指标——从业务角度解读统计学术语
Métric Name
Description
User Perspective
E.g.
# 分类指标示例 – 二分类任务常用指标列表 #
Accuracy
预测结果全部正确比例。当类别平衡时最直观,若严重不平衡,则误导。
测试用例通过率
python
accuracy_score
Precision
正类预测中真正正类所占比例。当假阳性成本高时关注,/n/
t/
t/
td>
Sorry—this snippet got garbled due to copy error in original source.
In practice use:
python
precision_score
**User Perspective**
如果你在做垃圾邮件过滤。每个误判为正常邮件会导致使用者体验下降,需要关注精确率。**Recall **
真实为正中被检出的比例。**User Perspective** — 检测漏报成本高时关注。不过,python
recall_score
**F1 Score**
精确率和召回率的调和平均。是二者平衡后的综合评分,python
f1_score
---
### 回归指标简介
| 指标 | 含义 | 示例代码 |
|------|------|----------|
| MSE | 均方误差;对大误差惩罚更重 | `mean_squared_error` |
| MAE | 平均绝对误差,更直观 | `mean_absolute_error` |
| R² | 决定系数;
话说回来,越接近 1 越好 | `r2_score` |
---
## 经典算法速查
### Liner Regression
* **用途** – 连续变量预测。* **原理** – 最小二乘法求出一条最佳直线。python
from sklearn.linear_model import LinearRegression
model = LinearRegression
model.fit
preds = model.predict
print
print # 每个特征贡献度
### Logistic Regression
* **用途** – 二分类问题。* **注意** – 名字里有“回归”,但是分类器。python
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression
clf.fit
prob_pos = clf.predict_proba
class_pos = clf.predict
再看print,.3f}")
### Decision Tree
* **用途** – 可解释的分类/回归树。不过,* **风险** – 容易过拟合,需要限制深度或样本阈值。python
from sklearn.tree import DecisionTreeClassifier,plot_tree
tree_clf = DecisionTreeClassifier
tree_clf.fit
plt.figure)
plot_tree(tree_clf。feature_names=X.columns,class_names=,filled=True,rounded=True,fontsize=10)
plt.show
### Random Forest
* **用途** – 多棵树投票聚合,更稳健。* **优点** – 抗噪声、减少过拟合。python
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=200,max_depth=None。random_state=42 )
rf_clf.fit
importances = rf_clf.feature_importances_
pd.Series.sort_values.plot
plt.title
plt.show
### K‑Means 聚类
* **用途** – 无监督划分相似样本组,可用于异常检测或推荐程序初步聚类。* **局限** – 假设簇为球形且大小相似。python
from sklearn.cluster import KMeans
kmeans = KMeans
clusters = kmeans.fit_predict)
plt.scatter,scaler.transform,c=clusters,cmap='viridis',alpha=.6)
plt.title
plt.show
---
## 实战案例:《Titanic》生存预测速成篇
以下代码已整合上面所有技巧,并演示如何提交 Kaggle:
python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# -------- 数据读取 ----------
train_df : pd.read_csv
test_df : pd.read_csv
features =
def clean:
# 基础清洗
df.fillna,inplace=True)
df.fillna,inplace=True)
# 编码
df =.astype
# 独热编码
df=pd.get_dummies
return df
train_cleaned : clean
test_cleaned : clean
X : train_cleaned.drop
y : train_cleaned
# -------- 数据拆分 ----------
X_tr。X_te,y_tr,y_te=train_test_split(
X,y,test_size=.20,rng_state=101,stratify=y)
scaler : StandardScaler
X_tr_s : scaler.fit_transform
X_te_s : scaler.transform
# -------- 模型 ----------
logreg : LogisticRegression)
logreg.fit
acc_logreg : logreg.score
print
rf : RandomForestClassifier(n_estimators=-200,max_depth=None,random_state=-101 )
rf.fit # RF不需要缩放
acc_rf : rf.score
print
best_model : rf if acc_rf>=acc_logreg else logreg
preds : best_model.predict
submission=pd.DataFrame({'PassengerId':test_df,'Survived' :preds})
submission.to_csv
print
---
## 算法选择教程快速表
二分类 小规模
少量样本、低维度。高维稀疏则略微增大,Pain point: "怕过拟合" .
Pain point: "想快速得到 baseline" .
Pain point: "缺少可解释性" .
.
/font b/>
/font b/>
/font b/>
////
二分类 大规模
丰富样本、多类别可能存在偏斜。Pain point: "想避免复杂超参搜索" .
多元回归 连续目标
线性关系明显时倾向 linear;否则采用 tree-based.
Pain point: "难以判断何时换树模式" .
聚类 无监督任务
稠密或稀疏结构均可;若需可解释簇中心,可考虑 GMM;K-means 常规默认。Pain point: "不知道 k 值该怎么选" .
再看一句话。#先跑逻辑回归做 baseline,再用随机森林效果更好——这是最快拿到可发布结果的方法!#
常见坑与方法速览
坑点名称 描述 建议解决办法
数据泄露 -- 测试信息混入训练集
在做任何预处理之前先拆分,接下来再 fit 所有 transform 在各自集合内完成。怎么说呢,/style ="text-align:center;" />
/style ="text-align:center;" />
/style ="text-align:center;" />
/style ="text-align:center;" />
/style ="text-align:center;" />
/style ="text-align:center;" />
无效缩放 —— 树 vs 线性 模型混用错误
树结构不受尺度影响,可直接使用原始数值;若同时使用 LR/KNN 等,请统一缩放后再切换到树。/style ="text-align:center;" />
类别不平衡导致偏向多数类
设置 class_weight=\"balanced\"<\/kbd>,或者采用 SMOTE 等上采样策略。/style ="text-align:center;" />
过拟合检查不足 —— 单一拆分导致偶然好结果
使用交叉验证 + StratifiedKFold,并观察标准差;若标准差较大说明稳定性不足。话说回来,
櫓淚␈ 杻 直㝰㖂㚶㨺䭰㖆䟶� ⬁ 🧦 📁 🡅 🡂 🚵 🚓 ⭕️ ➤ 🚯 🚳 🚑 ⚖️ 👬 🙅 📈 📉🀱🅙🧰⬕⚔️🚕⏹🏁💡🔧🔭📚🤓😴🥤👨💻🍕💪🙋♂️🚨🚢🏗️⚙️📐📍📌💬✏️🐞☕🎥🍿💻🤯👩🎓📊🧑🤝🧑🎉👑👊🔎🕵🏻♂️⌨️🐍🌟✴️🚀🤝🏆🚢⚓🎮🌱🌳🍀🌸🌼🌹✨⭐🙃👍🏻👏🏻🙌🏻😄❗✅❌☑️✓✈️⛵💣🔒🚫🔓⚠️🏥📷📺☎☎📞✉ 💬🙏🏼🤝😇🙄🥺😍😘😂😭😭😀😂🤣☺😊😉😊😘😁😆😅🙁🤔🙂👍🏼❤❤💕💕💞❤️❤️❤️💗💘♥︎🔥🔥🔥🔥♻︎♻︎↔︎⇔↔↕↔↑↓↖↘↗↙☂☁☃☄★☆★☆★☆★☆♪♫♬♭♮♯♪♫♬♭ ♯
"