数据准备是机器学习的第一步。你需要收集、清洗和处理数据以供模型使用。
模型训练是机器学习的核心步骤。你将数据用于训练算法,并生成一个模型。
from sklearn.cluster import KMeans
# 创建K-均值模型
kmeans = KMeans(n_clusters=2, random_state=0)
# 训练模型
kmeans.fit(X)
模型评估用于检查模型的表现。
from sklearn.metrics import silhouette_score
# 计算轮廓系数
silhouette_avg = silhouette_score(X, kmeans.labels_)
print(f"Silhouette Score: {silhouette_avg}")
模型保存用于将训练好的模型保存到文件中,以便将来使用。
joblib
或pickle
这样的库将模型保存到文件中。import joblib
# 保存模型
joblib.dump(kmeans, 'kmeans_model.pkl')
使用模型是将模型应用于新的数据以进行预测。
# 加载模型
loaded_model = joblib.load('kmeans_model.pkl')
# 使用模型进行预测
new_data = np.array([[45], [55]]) # 例子数据
predictions = loaded_model.predict(new_data)
print(predictions)
数据预测是将模型应用于实际数据,获取预测结果。
# 生成预测
labels = loaded_model.predict(X)
这就是机器学习的整个流程。希望这个详细的介绍能帮助你理解如何从头到尾进行模型训练和应用。如果你有具体的实现问题或需要更多细节,请随时告诉我!
下面是一个完整的案例 用于预测管道是否堵塞,
配置环境
python3 -m venv env
source env/bin/activate
pip install numpy matplotlib scikit-learn joblib
编写模型训练代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import joblib
# 1. 生成测试数据
def generate_data(n_samples=100):
# 生成水管内压力数据,分为正常和堵塞两类
np.random.seed(0)
pressure_normal = np.random.normal(loc=50, scale=10, size=(n_samples // 2, 1)) # 正常压力
pressure_blocked = np.random.normal(loc=30, scale=10, size=(n_samples // 2, 1)) # 堵塞压力
# 合并数据
pressures = np.vstack((pressure_normal, pressure_blocked))
return pressures
# 生成100个样本的数据
X = generate_data(n_samples=100)
# 2. 训练模型
kmeans = KMeans(n_clusters=2, random_state=0) # 两个簇(正常和堵塞)
kmeans.fit(X)
# 3. 判断哪个聚类中心是“正常”或“堵塞”
centroids = kmeans.cluster_centers_
normal_cluster = 0 if centroids[0] > centroids[1] else 1
blocked_cluster = 1 if normal_cluster == 0 else 0
# 可视化数据和聚类结果
plt.scatter(X, np.zeros_like(X), c=kmeans.labels_, cmap='viridis', marker='o')
plt.scatter(kmeans.cluster_centers_, np.zeros_like(kmeans.cluster_centers_), c='red', marker='x', s=100, label='Centroids')
plt.xlabel('Pressure')
plt.title('K-Means Clustering of Pipe Pressure Data')
plt.legend()
plt.show()
# 4. 保存模型
joblib.dump(kmeans, 'kmeans_model.pkl') # 将训练好的模型保存为pkl文件
print("模型已保存到 'kmeans_model.pkl'")
# 5. 加载模型并预测结果
# 加载模型
loaded_model = joblib.load('kmeans_model.pkl')
# 生成新数据用于测试预测
new_data = np.array([[45], [55], [25], [35]]) # 模拟新的压力数据
predictions = loaded_model.predict(new_data)
# 根据聚类中心的判断逻辑,确保类标记与实际含义匹配
for i, pressure in enumerate(new_data):
status = "正常" if predictions[i] == normal_cluster else "堵塞"
print(f"压力: {pressure[0]} 预测结果: {status}")
以上是完整代码,包括数据生成、模型训练、模型保存、加载和预测的流程。
generate_data()
函数生成水管压力数据,分为“正常”(50左右)和“堵塞”(30左右)两类。n_clusters=2
),假设这两个簇分别代表正常和堵塞。kmeans.cluster_centers_
),判断哪个簇代表“正常”,哪个簇代表“堵塞”。我们假设较高的聚类中心是“正常”,较低的聚类中心是“堵塞”。matplotlib
绘制数据点和聚类结果,聚类中心以红色 X
显示。joblib.dump()
保存模型为文件 kmeans_model.pkl
,并通过 joblib.load()
重新加载模型用于预测。new_data
测试新的压力值,通过 loaded_model.predict()
对数据进行分类,并根据聚类中心的语义判断是否是“正常”或“堵塞”。模型已保存到 'kmeans_model.pkl'
压力: 45 预测结果: 正常
压力: 55 预测结果: 正常
压力: 25 预测结果: 堵塞
压力: 35 预测结果: 堵塞
KMeans
训练了一个无监督学习模型,将水管压力数据聚类为“正常”和“堵塞”两类。