跳到主要内容
Python 数据分析进阶:模型评估与图像处理实战 | 极客日志
Python AI 算法
Python 数据分析进阶:模型评估与图像处理实战 深入探讨 Python 数据分析中的模型评估与性能优化。涵盖分类器、回归器及聚类的评估指标,如混淆矩阵、F1 分数、ROC 曲线及均方误差。同时介绍图像处理技术,包括 SIFT/SURF 特征提取、颜色量化、人脸检测及纹理分析。最后讲解并行计算与性能调优,涉及 Numba 编译、多线程、缓存策略及内存分析。旨在帮助开发者构建高效可靠的机器学习与数据处理流程。
Elasticer 发布于 2026/3/22 更新于 2026/4/26 3 浏览Python 数据分析进阶:模型评估与图像处理实战
评估分类器、回归器和聚类
在机器学习项目中,评估模型表现是至关重要的一环。这不仅关乎算法的准确性,还涉及速度、内存消耗及实际场景的适配性。面对众多评估指标,我们需要根据具体任务选择最合适的标准。
用混淆矩阵直接分类
准确率(Accuracy)是分类器的默认评估指标,但在类别不平衡时往往失效。混淆矩阵能更直观地展示分类结果,区分真阳性、假阳性、真阴性和假阴性。
def plot_cm (preds, y_test, title, cax ):
cm = confusion_matrix(preds.T, y_test)
normalized_cm = cm / cm.sum ().astype(float )
sns.heatmap(normalized_cm, annot=True , fmt='.2f' ,
vmin=0 , vmax=1 ,
xticklabels=['Rain' , 'No Rain' ],
yticklabels=['Rain' , 'No Rain' ], ax=cax)
cax.set_xlabel('Predicted class' )
cax.set_ylabel('Expected class' )
cax.set_title('Confusion Matrix for Rain Forecast | ' + title)
加载数据并绘制不同分类器的混淆矩阵:
import numpy as np
from sklearn.metrics import confusion_matrix
import seaborn as sns
import dautil as dl
y_test = np.load('rain_y_test.npy' )
sp = dl.plotting.Subplotter(2 , 2 )
plot_cm(y_test, np.load('rfc.npy' ), 'Random Forest' , sp.ax)
plot_cm(y_test, np.load('bagging.npy' ), 'Bagging' , sp.next_ax())
plot_cm(y_test, np.load('votes.npy' ), 'Votes' , sp.next_ax())
plot_cm(y_test, np.load('stacking.npy' ), , sp.next_ax())
plt.show()
'Stacking'
计算精度、召回率和 F1 分数 基于混淆矩阵的计数,我们可以计算更多维度的指标。精确度衡量预测为正的样本中有多少是真的正类;召回率衡量所有正样本中被正确找出的比例;F1 分数则是两者的调和平均数,用于平衡两者。
import numpy as np
from sklearn import metrics
import ch10util
import dautil as dl
y_test = np.load('rain_y_test.npy' )
accuracies = [metrics.accuracy_score(y_test, preds) for preds in ch10util.rain_preds()]
precisions = [metrics.precision_score(y_test, preds) for preds in ch10util.rain_preds()]
recalls = [metrics.recall_score(y_test, preds) for preds in ch10util.rain_preds()]
f1s = [metrics.f1_score(y_test, preds) for preds in ch10util.rain_preds()]
检查接收器操作特性 (ROC) 和曲线下面积 (AUC) ROC 曲线描绘了真阳性率与假阳性率之间的关系,而 AUC 值则总结了曲线的整体性能。AUC 越接近 1,模型效果越好。
from sklearn import metrics
import numpy as np
import ch10util
import dautil as dl
y_test = np.load('rain_y_test.npy' )
roc_aucs = [metrics.roc_auc_score(y_test, preds) for preds in ch10util.rain_preds()]
for preds, label in zip (ch10util.rain_preds(), ch10util.rain_labels()):
fpr, tpr, _ = metrics.roc_curve(y_test, preds, pos_label=True )
可视化拟合优度 对于回归问题,残差分析至关重要。理想的残差应随机分布且均值为零。通过 QQ 图或直方图可以检查残差是否符合正态分布。
import numpy as np
import matplotlib.pyplot as plt
import dautil as dl
import seaborn as sns
from scipy.stats import probplot
residuals = preds - y_test
probplot(residuals, plot=plt.gca())
sns.distplot(residuals, ax=plt.gca())
plt.show()
计算均方误差和中值绝对误差 MSE 对大误差敏感,而 MedAE 对异常值更稳健。两者都是衡量回归模型偏差的重要指标。
from sklearn import metrics
import ch10util
import dautil as dl
ch10util.plot_bootstrap('boosting' , metrics.mean_squared_error, ax)
ch10util.plot_bootstrap('boosting' , metrics.median_absolute_error, ax)
用平均轮廓系数评价聚类 在无监督学习中,轮廓系数用于评估聚类的紧密度和分离度。值越接近 1,聚类效果越好。
import dautil as dl
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
avgs = []
rng = range (2 , 9 )
for i in rng:
kmeans = KMeans(n_clusters=i, random_state=37 )
labels = kmeans.fit_predict(X)
avg = silhouette_score(X, labels)
avgs.append(avg)
与虚拟分类器/回归器进行比较 为了验证模型的有效性,通常将其与基线模型(如随机猜测或均值预测)进行比较。scikit-learn 提供了 DummyClassifier 和 DummyRegressor 作为基准。
from sklearn.dummy import DummyClassifier
stratified = DummyClassifier(strategy='stratified' , random_state=28 )
stratified.fit(X_train, y_train)
preds.append(stratified.predict(X_test))
检验分类的 Kappa 和马修斯相关系数 Kappa 系数考虑了随机一致性,比单纯准确率更可靠。马修斯相关系数 (MCC) 综合了混淆矩阵的所有四个数值,适用于不平衡数据集。
kappas = [metrics.cohen_kappa_score(y_test, preds) for preds in ch10util.rain_preds()]
mc = [metrics.matthews_corrcoef(y_test, preds) for preds in ch10util.rain_preds()]
分析图像 图像处理是数据分析的重要分支,涉及特征提取、分割及模式识别。
设置 OpenCV OpenCV 是计算机视觉领域的核心库。安装时需注意依赖项,特别是 SIFT 和 SURF 等专利算法模块可能需要额外配置。
apt-get update
apt-get install -y cmake make git g++
应用尺度不变特征变换 (SIFT) 和 SURF SIFT 和 SURF 算法用于检测图像中的关键点,具有旋转和缩放不变性。SURF 通常在速度上优于 SIFT。
import cv2
import matplotlib.pyplot as plt
import dautil as dl
from scipy.misc import face
img = face()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kps, descs = sift.detectAndCompute(gray, None )
img2 = cv2.drawKeypoints(gray, kps, None , (0 , 0 , 255 ))
plt.imshow(img2)
plt.show()
量化颜色 通过 K-means 聚类减少图像颜色数量,实现颜色量化,常用于压缩或风格化处理。
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10 , 1.0 )
for k in [2 , 4 , 8 ]:
_, label, center = cv2.kmeans(Z, k, None , criteria, 10 , cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
plt.imshow(res2)
plt.show()
图像去噪与分割 利用形态学操作和阈值处理去除噪声并分割前景背景。大津阈值法 (Otsu's method) 是一种自动确定最佳阈值的常用方法。
_, thresh = cv2.threshold(gray, 0 , 255 , cv2.THRESH_OTSU)
kernel = np.ones((3 , 3 ), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2 )
bg = cv2.dilate(opening, kernel, iterations=3 )
人脸检测与纹理特征 哈尔级联分类器可用于快速人脸检测。哈拉里克纹理特征则基于共现矩阵,用于描述图像的纹理模式。
face_cascade = cv2.CascadeClassifier(path)
faces = face_cascade.detectMultiScale(img, 1.3 , 5 )
并行性和性能 随着数据量增长,优化代码性能变得至关重要。Python 生态提供了多种工具来提升执行效率。
用 Numba 进行即时编译 Numba 可以将 Python 函数编译为机器码,显著提升数值计算速度,支持 CPU 和 GPU 加速。
from numba import jit
@jit(nopython=True )
def jit_version (x, y, z ):
return x**2 + y**2 + z**2
用 Numexpr 加速数值表达式 Numexpr 通过分块处理和避免临时变量来优化数组运算,特别适合大型数组计算。
import numexpr as ne
result = ne.evaluate("2 * a ** 3 + 3 * b ** 9" )
多线程与并发任务 利用 threading 或 concurrent.futures 模块可以在 I/O 密集型任务中实现并行处理,突破 GIL 限制。
import concurrent.futures
def parallel (arr, n ):
executor = concurrent.futures.ThreadPoolExecutor(max_workers=8 )
for x in executor.map (bootstrapper.run, range (n)):
pass
异步 IO 与分布式处理 asyncio 模块允许单线程下高效处理大量 I/O 操作。execnet 则支持跨节点的分布式计算。
内存分析与缓存策略 使用 memory_profiler 监控内存泄漏。LRU 缓存可减少对重复计算的开销,提升响应速度。
from functools import lru_cache
@lru_cache(maxsize=None )
def cached_func (arg ):
return expensive_computation(arg)
流式计数与 GPU 加速 Count-Min Sketch 算法适用于海量数据的近似计数。OpenCL 则允许利用 GPU 进行大规模并行计算。
import pyopencl as cl
program = cl.Program(context, """
__kernel void mean_squared_error(__global const float *a, __global const float *b, __global float *result) {
int gid = get_global_id(0);
float temp = a[gid] - b[gid];
result[gid] = temp * temp;
}
""" ).build()
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online