聚类
聚类是一种将数据集中的对象按照某种相似性度量标准划分成若干个组(或称为簇)的过程,使得同一个簇内的对象尽可能相似,不同簇之间的对象尽可能不同。K均值算法是其中最常用的一种聚类方法。
示例:使用K均值进行客户分群
假设有一个包含客户购买行为的数据集,想要根据这些行为将客户分为不同的群体。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建并训练K均值模型
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
# 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.75, marker='x')
plt.title('K-means Clustering')
plt.show()
make_blobs
函数用来创建一个具有指定数量的中心点和样本数的数据集。KMeans
类用于执行K均值聚类。fit
方法训练模型,并找到最佳的簇中心。labels_
属性包含了每个样本所属的簇标签。cluster_centers_
属性给出了每个簇的中心位置。
降维
降维技术主要用于减少数据集中特征的数量,同时尽量保留原始数据的重要信息。这不仅有助于提高计算效率,也便于数据可视化。主成分分析(PCA)是一种常用的线性降维方法。
示例:使用PCA对图像数据进行降维
假设有一组人脸图片数据,将使用PCA来降低特征维度,从而简化后续处理。
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_lfw_people
import matplotlib.pyplot as plt
# 加载数据
lfw_dataset = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
X, y = lfw_dataset.data, lfw_dataset.target
# 应用PCA降维
n_components = 150 # 设置降维后的特征数量
pca = PCA(n_components=n_components, svd_solver='randomized', whiten=True).fit(X)
# 转换数据
X_pca = pca.transform(X)
# 可视化部分主成分
fig, axes = plt.subplots(3, 8, figsize=(9, 4),
subplot_kw={'xticks':[], 'yticks':[]},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
ax.imshow(pca.components_[i].reshape(50, 37), cmap='bone')
plt.suptitle("Principal Components")
plt.show()
fetch_lfw_people
函数加载LFW人脸数据库的一个子集。PCA
类初始化了一个PCA模型。fit
方法拟合PCA模型以确定主成分。transform
方法应用PCA变换,得到降维后的数据。
异常检测
异常检测用于识别那些显著不同于其他观察值的数据点。这对于检测欺诈交易、系统故障等场景非常有用。孤立森林(Isolation Forest)是一种有效的异常检测算法。
示例:使用Isolation Forest进行信用卡欺诈检测
假设有一个信用卡交易数据集,需要从中找出潜在的欺诈交易。
from sklearn.ensemble import IsolationForest
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
data = pd.read_csv('creditcard.csv') # 假设CSV文件中包含交易记录及其是否为欺诈的信息
X = data.drop(['Time', 'Amount', 'Class'], axis=1) # 选择特征
y = data['Class'] # 欺诈标签
# 创建并训练Isolation Forest模型
iso_forest = IsolationForest(contamination=0.01, random_state=42) # 设定污染比例为1%
iso_forest.fit(X)
# 预测异常
outliers = iso_forest.predict(X)
outliers[outliers == 1] = 0 # 正常
outliers[outliers == -1] = 1 # 异常
# 评估模型
print("Accuracy:", accuracy_score(y, outliers))
print(classification_report(y, outliers))
# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(range(len(data)), data['V1'], c=outliers, cmap='coolwarm', s=10)
plt.title('Anomaly Detection with Isolation Forest')
plt.xlabel('Transaction Index')
plt.ylabel('Feature V1 Value')
plt.show()
IsolationForest
类初始化了一个孤立森林模型。contamination
参数指定了数据集中预期的异常比例。predict
方法返回-1表示异常,1表示正常。- 我们通过对比实际标签和预测结果来评估模型性能。
- 最后,通过散点图直观展示检测到的异常点。