一、环境安装与基础认知

1.1 依赖库安装

本机提前装好Python3.8及以上版本,终端执行安装命令,一次性配齐机器学习全量依赖:

# pip一键安装
pip install scikit-learn pandas numpy matplotlib joblib
# Anaconda用户可选
conda install scikit-learn numpy pandas matplotlib

安装完成后,在Python终端导入验证,无报错即环境就绪:

import sklearn, pandas, numpy, matplotlib
print(sklearn.__version__)

1.2 sklearn四大核心模块与机器学习任务划分

1)库结构拆分(新手必记)
  • datasets:内置开源数据集(鸢尾花、波士顿房价、葡萄酒数据集,练手专用)
  • preprocessing:数据预处理(标准化、编码、缺失值填充)
  • model_selection:数据集拆分、交叉验证、超参搜索
  • linear_model/tree/ensemble:各类算法模型包(线性、决策树、集成树)
  • metrics:模型效果评估指标(准确率、MSE、AUC、F1)
  • pipeline:流水线组件,串联预处理+模型,规避数据泄露
2)两大主流任务

监督学习(带标签,项目最常用)

  • 分类:输出离散类别(判断是否患病、商品好坏、花卉品种)
  • 回归:输出连续数值(预测房价、销量、收入)
    无监督学习(无标签)
  • 聚类:用户分群、异常检测(Kmeans)、降维PCA

1.3 sklearn统一API规范(重中之重,全库通用)

所有模型固定三步调用,fit训练、predict预测、score打分,切换算法仅需更换模型实例,不用改写整体代码:

  1. model.fit(X_train,y_train):用训练数据拟合模型(无监督只需X_train)
  2. y_pred = model.predict(X_test):测试集预测结果
  3. model.score(X_test,y_test):一键输出模型得分(分类准确率/回归R²)

二、实战案例一:监督学习·鸢尾花多分类(入门首选)

任务说明:根据花瓣、花萼长宽4项特征,区分3种鸢尾花品种,sklearn内置经典数据集,零数据准备成本。

2.1 加载数据+数据探查

from sklearn.datasets import load_iris
import pandas as pd

# 加载内置数据集
iris = load_iris()
# X特征数据,y标签(0/1/2对应3种花)
X, y = iris.data, iris.target
# 转为DataFrame方便肉眼查看数据
df = pd.DataFrame(X, columns=iris.feature_names)
df["flower_type"] = [iris.target_names[i] for i in y]
print("数据集样本总量:",X.shape[0])
print("特征字段:",iris.feature_names)
print("花卉类别:",iris.target_names)
print(df.head(3))

2.2 数据集拆分(训练集+测试集,项目硬性规范)

不能用全部数据训练再自测,拆分目的:训练集学规律,测试集模拟真实新数据,检验泛化能力

from sklearn.model_selection import train_test_split
'''
参数说明:
test_size:测试集占比20%,训练集80%;
random_state:固定随机种子,每次拆分结果一致,方便复现代码;
stratify=y:分层抽样,训练/测试集中各类样本占比和原数据一致,避免某类数据全进训练/测试集
'''
X_train,X_test,y_train,y_test = train_test_split(
    X,y,test_size=0.2,random_state=42,stratify=y
)
print("训练集大小:",X_train.shape)
print("测试集大小:",X_test.shape)

2.3 模型选择、训练与预测

选用K近邻KNN分类器,同时演示替换随机森林,直观感受API统一:

# 方式1:KNN分类
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5) # n_neighbors邻近样本数
knn.fit(X_train,y_train) # 训练
y_pred_knn = knn.predict(X_test) # 测试集预测

# 方式2:随机森林分类(只需更换模型一行代码)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=50,random_state=42)
rf.fit(X_train,y_train)
y_pred_rf = rf.predict(X_test)

2.4 分类模型效果评估

from sklearn.metrics import accuracy_score,classification_report
# 准确率:预测正确样本/总样本
acc_knn = accuracy_score(y_test,y_pred_knn)
acc_rf = accuracy_score(y_test,y_pred_rf)
print(f"KNN准确率:{acc_knn:.2f}")
print(f"随机森林准确率:{acc_rf:.2f}")
# 详细分类报告(精确率、召回率、F1分数,不平衡数据集必备)
print(classification_report(y_test,y_pred_rf,target_names=iris.target_names))

三、实战案例二:监督学习·波士顿房价回归预测

任务:根据房屋面积、楼层、配套等特征,预测房屋成交均价(连续数值,回归任务)

3.1 数据载入与拆分

from sklearn.datasets import load_diabetes # 新版sklearn移除波士顿,用糖尿病数据集替代回归练手
data = load_diabetes()
X,y = data.data,data.target
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)

3.2 数据标准化(回归/距离类模型必做预处理)

KNN、线性回归、SVM对特征数值范围敏感,不同单位特征需要标准化:用训练集均值方差缩放测试集,禁止全量数据统一标准化(数据泄露重大错误)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# fit仅从训练集学习均值、标准差;transform执行缩放
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 测试集只用transform!

3.3 线性回归建模+回归指标评估

回归不用准确率,采用MAE平均绝对误差、MSE均方误差、R²拟合优度:

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score

lr = LinearRegression()
lr.fit(X_train_scaled,y_train)
y_pred = lr.predict(X_test_scaled)

# 评估
mae = mean_absolute_error(y_test,y_pred)
mse = mean_squared_error(y_test,y_pred)
r2 = r2_score(y_test,y_pred)
print(f"平均绝对误差MAE:{mae:.2f}")
print(f"均方误差MSE:{mse:.2f}")
print(f"拟合优度R²:{r2:.2f}")
# 查看特征权重
print("各特征系数:",lr.coef_)

四、进阶1:Pipeline流水线(项目工程化必备,根治数据泄露)

实际项目多步骤:特征预处理→模型训练,Pipeline把多步骤封装成一条流水线,自动分步执行fit/transform,是企业标准写法,避免手动拆分预处理出错。

from sklearn.pipeline import Pipeline

# 流水线:第一步标准化,第二步随机森林
pipe = Pipeline(steps=[
    ("std",StandardScaler()),
    ("rf",RandomForestClassifier(random_state=42))
])
# 一行完成预处理+训练,不用手动缩放数据
pipe.fit(X_train,y_train)
pred = pipe.predict(X_test)
print("流水线模型准确率:",accuracy_score(y_test,pred))

五、进阶2:交叉验证,规避单次拆分偶然性

单次划分数据集结果有随机性,5折交叉验证:数据分5份,轮流4份训练1份测试,取平均分,评估模型真实泛化性能。

from sklearn.model_selection import cross_val_score
# cv=5 5折交叉验证
scores = cross_val_score(knn,X,y,cv=5,scoring="accuracy")
print("5折验证各轮准确率:",scores.round(2))
print("交叉验证平均准确率:",scores.mean().round(2))

六、进阶3:网格搜索GridSearchCV自动调超参数

新手手动试参数效率极低,GridSearch遍历指定参数组合,自动选出最优超参,集成交叉验证。

from sklearn.model_selection import GridSearchCV
# KNN候选参数
param_grid = {"n_neighbors":[3,5,7,9,11]}
grid = GridSearchCV(KNeighborsClassifier(),param_grid,cv=5)
grid.fit(X_train,y_train)
print("最优近邻数:",grid.best_params_)
print("最优模型交叉验证得分:",grid.best_score_.round(2))
# 最优模型预测
best_pred = grid.best_estimator_.predict(X_test)

七、进阶4:模型持久化保存与加载(落地部署)

训练好的模型不用重复训练,joblib保存为本地文件,线上直接加载预测新数据:

import joblib
# 保存模型
joblib.dump(grid.best_estimator_,"best_iris_model.pkl")
# 后续加载模型
load_model = joblib.load("best_iris_model.pkl")
# 新样本预测
new_sample = [[5.1,3.5,1.4,0.2]]
res = load_model.predict(new_sample)
print("预测花卉:",iris.target_names[res[0]])

八、无监督入门:Kmeans聚类(无标签数据自动分组)

场景:用户画像分群、商品聚类,无需标签y,仅传入特征X

from sklearn.cluster import KMeans
# 分3簇
kmeans = KMeans(n_clusters=3,random_state=42)
cluster_label = kmeans.fit_predict(X)
# 输出每个样本所属分组
print("聚类分组结果:",cluster_label[:10])

更多推荐