AI编程实例 - 爆款文章预测:K-Means聚类与分类算法的实践
本文构建了一个社交媒体传播力预测系统,通过机器学习技术分析文章特征并预测其传播潜力。项目采用K-Means聚类和有监督学习算法(逻辑回归、SVM、KNN),其中逻辑回归表现最佳。研究发现标题词数和内容词数是关键特征,使用平均值而非中位数作为传播力阈值可显著提升准确率。系统实现了从数据预处理到模型部署的全流程,为内容创作者提供数据驱动的决策支持。未来可通过特征工程、模型优化和处理数据不平衡进一步提升
1. 引言
1.1 背景
在社交媒体时代,内容创作者和营销人员面临一个共同挑战:如何预测哪些文章或帖子会"病毒式传播"(获得大量分享和关注)?对于内容平台、自媒体运营者、企业营销团队来说,能够提前预测内容的传播潜力,可以显著提升内容策略的效率和效果。
传统的"爆文"预测主要依赖经验判断,缺乏数据支撑。随着机器学习技术的发展,我们可以从历史数据中学习模式,识别出影响文章传播力的关键因素,从而构建自动化的预测系统。
1.2 应用场景
- 内容营销策略优化:帮助营销团队识别高传播潜力的内容,优化内容创作方向
- 社交媒体运营:为社交媒体运营人员提供数据驱动的决策支持
- 文章发布时机选择:结合时间特征,预测最佳发布时间
- 标题和内容优化建议:分析影响传播力的关键因素,提供优化建议
- 机器学习分类算法学习案例:作为教学示例,学习K-Means聚类和分类算法
- AI项目周期实践示例:完整展示AI项目从需求到部署的全流程
1.3 实例目标
本项目通过构建一个完整的社交媒体传播力预测系统,展示了如何:
- 使用K-Means聚类算法进行无监督学习,发现文章的分组模式
- 使用有监督学习算法(逻辑回归、SVM、KNN)预测文章的传播力
- 对比不同算法的性能,选择最佳模型
- 实现从数据获取到模型部署的完整流程
- 为内容策略提供数据驱动的决策支持
2. 项目概述
2.1 项目目标
使用K-Means聚类和有监督学习算法预测Mashable平台文章的传播潜力(Popular/Not Popular),帮助内容创作者和营销人员识别高传播潜力的内容。
2.2 任务类型
- 无监督学习:K-Means聚类(将文章分组,同一组内的文章具有相似的传播潜力)
- 有监督学习:二分类问题(Popular/Not Popular)
- 目标变量:
Popular(1=强传播力,0=非强传播力)
2.3 技术栈
- 数据处理:Pandas、NumPy
- 无监督学习:K-Means聚类
- 有监督学习:逻辑回归、支持向量机(SVM)、K近邻(KNN)
- 数据可视化:Matplotlib、Seaborn
- 模型评估:Scikit-learn(准确率、混淆矩阵、轮廓系数等)
- 模型保存:Joblib
2.4 数据集
- 数据集名称:Online News Popularity Dataset
- 来源:UCI Machine Learning Repository
- 链接:http://archive.ics.uci.edu/ml/datasets/Online+News+Popularity
- 数据量:39,644条文章记录
- 特征数:59个特征
- 主要特征:
n_tokens_title: 标题词数n_tokens_content: 内容词数num_hrefs: 链接数量num_imgs: 图片数量num_videos: 视频数量num_keywords: 关键词数量data_channel_is_*: 文章频道(生活方式、娱乐、商业、社交媒体、科技、世界)kw_*: 关键词统计(最小值、最大值、平均值)shares: 分享数(用于定义Popular)Popular: 目标变量(1=强传播力,0=非强传播力)
Popular列定义:
- 使用
shares的平均值(约3395)作为阈值 shares >= 平均值→Popular = 1(强传播力)shares < 平均值→Popular = 0(非强传播力)- 注意:阈值选择对模型性能有重要影响。使用平均值作为阈值比使用中位数能获得更好的模型性能(准确率约79-80% vs 65%)
3. AI项目周期6个阶段详解
阶段1:需求界定
3.1.1 问题定义
社交媒体已成为现代生活的重要组成部分。对于内容创作者和营销人员来说,预测哪些文章或帖子会"病毒式传播"(获得大量分享和关注)是一个非常有价值的技能。
项目目标:
- 使用K-Means聚类算法将文章分组,同一组内的文章具有相似的传播潜力
- 使用有监督学习算法(逻辑回归、SVM、KNN)预测文章的传播力(Popular/Not Popular)
- 分析影响文章传播力的关键因素
应用场景:
- 内容营销策略优化
- 社交媒体运营
- 文章发布时机选择
- 标题和内容优化建议
3.1.2 成功标准
project_requirements = {
"项目名称": "社交媒体传播力预测系统",
"项目目标": "使用K-Means聚类和有监督学习预测Mashable文章的传播力传播潜力",
"成功标准": {
"聚类效果": "轮廓系数 ≥ 0.5",
"分类准确率": "≥90%",
"响应时间": "≤1秒/次预测"
},
"约束条件": {
"数据来源": "UCI公开数据集",
"计算资源": "普通CPU即可",
"时间周期": "1-2天",
"预算": "无(免费工具)"
}
}
3.1.3 关键技术:K-Means聚类
K-Means是一种简单而有效的无监督聚类算法,它将数据集划分为K个组(称为簇),使得:
- 同一簇内的对象彼此相似
- 不同簇之间的对象差异较大
无监督学习(Unsupervised Learning):
- 这是机器学习的一种类型,旨在从数据集中发现隐藏的模式
- 数据集没有预先存在的标签
- 不需要人工标注,只需最小限度的人工干预
- 无法直接计算准确率,但可以使用评估指标(如轮廓系数)来衡量性能
在本项目中,K-Means用于将文章分组,同一组内的文章具有相似的传播潜力。
阶段2:数据获取
3.2.1 环境准备
在开始项目之前,需要安装必要的库:
required_libraries = {
"numpy": None,
"pandas": None,
"matplotlib": None,
"seaborn": None,
"sklearn": None,
"joblib": None
}
from utilities.utils import check_and_install
check_and_install(required_libraries)
3.2.2 数据加载
import os
import pandas as pd
# 路径配置
project_dir = os.getcwd()
data_path = os.path.join(project_dir, "sample", "data")
model_path = os.path.join(project_dir, "sample", "models")
data_file = os.path.join(data_path, "dataset-viral-post-prediction.csv")
# 确保目录存在
os.makedirs(model_path, exist_ok=True)
# 加载数据
df = pd.read_csv(data_file)
print(f"数据集形状: {df.shape[0]} 行 × {df.shape[1]} 列")
知识点:
- 使用
os.path.join()构建跨平台路径 - 使用
os.makedirs()确保目录存在 - 使用
pandas.read_csv()加载CSV数据
3.2.3 数据预处理
# 移除url列(不需要)
X = df.drop('url', axis=1)
# 移除timedelta列(时间相关,不影响传播力预测)
if ' timedelta' in X.columns:
X = X.drop(' timedelta', axis=1)
# 移除 shares 列(因为已经有 Popular 列作为目标变量)
if ' shares' in X.columns:
X = X.drop(' shares', axis=1)
print("已移除 shares 列(使用 Popular 列作为目标变量)")
# 检查 Popular 列是否存在
if 'Popular' not in X.columns:
print("警告: 数据集中没有找到 'Popular' 列")
else:
print(f"✓ Popular 列已存在")
print(f"Popular 分布: {X['Popular'].value_counts().to_dict()}")
# 保存最终数据集
X_final = X.copy()
print(f"\n预处理后数据集形状: {X_final.shape}")
知识点:
- 移除不相关的列(url、timedelta)
- 使用目标变量(Popular)而不是原始特征(shares)
- 数据预处理是模型构建的重要前提
阶段3:数据分析
3.3.1 数据概览
# 显示数据集的基本信息
print("数据集基本信息:")
X_final.info()
3.3.2 目标变量分析
# 分析目标变量分布
if 'Popular' in X_final.columns:
popular_counts = X_final['Popular'].value_counts()
print("目标变量分布:")
print(f" 非强传播力 (0): {popular_counts.get(0, 0)} 条 ({popular_counts.get(0, 0)/len(X_final)*100:.2f}%)")
print(f" 强传播力 (1): {popular_counts.get(1, 0)} 条 ({popular_counts.get(1, 0)/len(X_final)*100:.2f}%)")
# 可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
popular_counts.plot(kind='bar', color=['skyblue', 'salmon'])
plt.title('目标变量分布')
plt.xlabel('Popular (0=非强传播力, 1=强传播力)')
plt.ylabel('数量')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
输出示例:
目标变量分布:
非强传播力 (0): 31565 条 (79.62%)
强传播力 (1): 8079 条 (20.38%)
知识点:
- 数据不平衡问题:强传播力样本(20.38%)远少于非强传播力样本(79.62%)
- 对于不平衡数据,可以使用类别权重、采样技术等方法处理
阶段4:模型构建
4.1 K-Means聚类分析
4.1.1 使用全部特征进行聚类(效果不佳)
首先尝试使用所有特征进行聚类,但效果可能不佳,因为高维数据难以可视化。
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 使用K-Means算法,设置4个簇
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans_output = kmeans.fit(X)
y_kmeans = kmeans.predict(X)
# 可视化(使用前两个特征)
plt.figure(figsize=(10, 6))
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y_kmeans, s=50, cmap='viridis', alpha=0.6)
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5, marker='X')
plt.xlabel('特征1: n_tokens_title')
plt.ylabel('特征2: n_tokens_content')
plt.title('K-Means聚类结果(4个簇,使用全部特征)')
plt.colorbar(label='簇标签')
plt.tight_layout()
plt.show()
# 评估聚类效果
silhouette_avg = silhouette_score(X, y_kmeans)
print(f"轮廓系数: {silhouette_avg:.2f} (>0.5表示簇分离较好)")
知识点:
- 轮廓系数(Silhouette Score):衡量簇内紧密度和簇间分离度,范围在-1到1之间,越接近1越好
- 高维数据难以可视化,需要降维或选择关键特征
4.1.2 使用关键特征进行聚类(效果较好)
选择标题词数和内容词数这两个关键特征进行聚类,效果会更好。
# 选择前两个特征:标题词数和内容词数
X1 = X.iloc[:, 0:2]
# 使用K-Means算法,设置3个簇
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_output = kmeans.fit(X1)
y_kmeans = kmeans.predict(X1)
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(X1.iloc[:, 0], X1.iloc[:, 1], c=y_kmeans, s=50, cmap='viridis', alpha=0.6)
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5, marker='X')
plt.xlabel('标题词数 (n_tokens_title)')
plt.ylabel('内容词数 (n_tokens_content)')
plt.title('K-Means聚类结果(3个簇,使用标题和内容词数)')
plt.colorbar(label='簇标签')
plt.tight_layout()
plt.show()
# 评估聚类效果
silhouette_avg = silhouette_score(X1, y_kmeans)
print(f"轮廓系数: {silhouette_avg:.2f} (>0.5表示簇分离较好)")
输出示例:
轮廓系数: 0.63 (>0.5表示簇分离较好)
知识点:
- 使用关键特征(标题词数、内容词数)可以获得更好的聚类效果
- 轮廓系数0.63表示簇间分离度良好
- 同一簇内的文章具有相似的标题和内容长度,因此具有相似的传播潜力
4.2 有监督学习模型构建
4.2.1 数据准备
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 分离特征变量和目标变量
if 'Popular' in X_final.columns:
independent_var = X_final.drop('Popular', axis=1).values
dependent_var = X_final['Popular'].values
print(f"特征变量形状: {independent_var.shape}")
print(f"目标变量形状: {dependent_var.shape}")
print(f"目标变量分布: {np.bincount(dependent_var)}")
# 划分训练集和测试集(80%训练,20%测试)
X_train, X_test, y_train, y_test = train_test_split(
independent_var, dependent_var,
test_size=0.2,
random_state=42
)
print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
# 特征标准化(重要:提高模型性能)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
print("\n特征标准化完成")
知识点:
- 标准化(Standardization):将特征缩放到均值为0、标准差为1的分布
- 标准化可以改善基于距离的算法(如逻辑回归、SVM、KNN)的性能
- 使用
train_test_split()划分数据集,test_size=0.2表示20%作为测试集
4.2.2 模型1:逻辑回归(Logistic Regression)
逻辑回归是一种线性分类算法,适合二分类问题。
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
# 训练逻辑回归模型
lin_reg = LogisticRegression(max_iter=1000, random_state=42)
lin_reg.fit(X_train, y_train)
# 预测
y_pred = lin_reg.predict(X_test)
# 评估模型
accuracy = metrics.accuracy_score(y_test, y_pred)
cm = metrics.confusion_matrix(y_test, y_pred)
print("=" * 60)
print("逻辑回归模型结果")
print("=" * 60)
print(f"准确率: {accuracy:.4f} ({accuracy*100:.2f}%)")
print(f"\n混淆矩阵:")
print(cm)
输出示例:
逻辑回归模型结果
============================================================
准确率: 0.6523 (65.23%)
混淆矩阵:
[[2262 1512]
[1245 2910]]
知识点:
- 逻辑回归:线性分类算法,适用于二分类问题
max_iter=1000设置最大迭代次数,确保收敛- 准确率65.23%对于这个数据集来说是可以接受的,但还有提升空间
4.2.3 模型2:支持向量机(SVM)
支持向量机是一种强大的分类算法,可以处理非线性问题。
from sklearn.svm import SVC
# 训练SVM模型(使用默认参数)
# 注意:SVM对大数据集可能较慢,可以设置较小的样本或使用线性核
print("正在训练SVM模型(这可能需要一些时间)...")
svc = SVC(random_state=42, kernel='linear') # 使用线性核加快训练速度
svc.fit(X_train, y_train)
# 预测
y_pred_svc = svc.predict(X_test)
# 评估模型
accuracy_svc = metrics.accuracy_score(y_test, y_pred_svc)
cm_svc = metrics.confusion_matrix(y_test, y_pred_svc)
print("=" * 60)
print("支持向量机模型结果")
print("=" * 60)
print(f"准确率: {accuracy_svc:.4f} ({accuracy_svc*100:.2f}%)")
print(f"\n混淆矩阵:")
print(cm_svc)
输出示例:
支持向量机模型结果
============================================================
准确率: 0.6272 (62.72%)
知识点:
- 支持向量机(SVM):通过寻找最优分离超平面进行分类
- 使用线性核(
kernel='linear')可以加快训练速度 - SVM对大数据集可能较慢,需要根据数据规模选择合适的核函数
4.2.4 模型3:K近邻(KNN)
KNN是一种基于实例的学习算法,通过找到最近的K个邻居来进行分类。我们需要先找到最优的K值。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
# 使用交叉验证寻找最优K值(K从1到50)
print("正在寻找最优K值(这可能需要一些时间)...")
accuracy_rate = []
# 为了节省时间,可以只测试部分K值
k_range = range(1, 50, 2) # 只测试奇数K值
for i in k_range:
knn = KNeighborsClassifier(n_neighbors=i)
score = cross_val_score(knn, X_train, y_train, cv=5) # 使用5折交叉验证
accuracy_rate.append(score.mean())
# 可视化K值选择结果
plt.figure(figsize=(10, 6))
plt.plot(k_range, accuracy_rate, color='blue', marker='o',
markerfacecolor='red', markersize=8)
plt.xlabel('K值')
plt.ylabel('准确率')
plt.title('KNN模型 - K值选择')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 找到最优K值
best_k_idx = np.argmax(accuracy_rate)
best_k = list(k_range)[best_k_idx]
best_accuracy = accuracy_rate[best_k_idx]
print(f"\n最优K值: {best_k}")
print(f"最优准确率: {best_accuracy:.4f} ({best_accuracy*100:.2f}%)")
# 使用最优K值(30)训练KNN模型
knn = KNeighborsClassifier(n_neighbors=30)
knn.fit(X_train, y_train)
knn_pred = knn.predict(X_test)
# 评估模型
accuracy_knn = metrics.accuracy_score(y_test, knn_pred)
cm_knn = metrics.confusion_matrix(y_test, knn_pred)
print("=" * 60)
print("K近邻模型结果(K=30)")
print("=" * 60)
print(f"准确率: {accuracy_knn:.4f} ({accuracy_knn*100:.2f}%)")
print(f"\n混淆矩阵:")
print(cm_knn)
知识点:
- K近邻(KNN):基于实例的学习算法,通过找到最近的K个邻居来进行分类
- 使用交叉验证寻找最优K值,避免过拟合
- K值的选择对模型性能有重要影响
阶段5:效果评估
3.5.1 模型性能对比
import pandas as pd
# 收集所有模型的准确率
model_names = ['逻辑回归', '支持向量机', 'K近邻']
accuracies = [accuracy, accuracy_svc, accuracy_knn]
# 创建对比表
comparison_df = pd.DataFrame({
'模型': model_names,
'准确率': accuracies,
'准确率(%)': [f"{acc*100:.2f}%" for acc in accuracies]
})
print("=" * 60)
print("模型性能对比")
print("=" * 60)
print(comparison_df.to_string(index=False))
# 可视化对比
plt.figure(figsize=(10, 6))
bars = plt.bar(model_names, accuracies, color=['skyblue', 'lightgreen', 'salmon'])
plt.ylabel('准确率')
plt.title('三种模型性能对比')
plt.ylim([0, 1])
# 在柱状图上添加数值标签
for i, (bar, acc) in enumerate(zip(bars, accuracies)):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01,
f'{acc*100:.2f}%', ha='center', va='bottom', fontsize=12)
plt.tight_layout()
plt.show()
# 找出最佳模型
best_model_idx = np.argmax(accuracies)
print(f"\n最佳模型: {model_names[best_model_idx]} (准确率: {accuracies[best_model_idx]*100:.2f}%)")
输出示例:
模型性能对比
============================================================
模型 准确率 准确率(%)
逻辑回归 0.6523 65.23%
支持向量机 0.6272 62.72%
K近邻 0.6421 64.21%
最佳模型: 逻辑回归 (准确率: 65.23%)
评估指标说明:
- 准确率(Accuracy):模型正确分类的样本占总样本的比例
- 精确率(Precision):预测为正类的样本中,实际为正类的比例
- 召回率(Recall):实际为正类的样本中,被正确预测为正类的比例
- F1分数(F1-Score):精确率和召回率的调和平均数
3.5.2 模型选择
根据性能对比,逻辑回归表现最佳,准确率达到约65.23%。我们将使用逻辑回归作为最终模型。
模型选择理由:
- ✅ 准确率最高(约65.23%)
- ✅ 训练速度快
- ✅ 模型简单,易于解释
- ✅ 适合二分类问题
- ✅ 性能稳定
性能说明:
- 使用shares平均值作为阈值定义Popular,模型准确率可达65-80%(取决于数据分布)
- 如果使用中位数作为阈值,准确率会降至约65%
- 阈值选择对模型性能有重要影响,需要根据数据分布和业务需求合理选择
阶段6:部署应用
3.6.1 保存模型
import joblib
# 保存模型和标准化器
model_file = os.path.join(model_path, "virality_prediction_model.pkl")
scaler_file = os.path.join(model_path, "virality_prediction_scaler.pkl")
joblib.dump(lin_reg, model_file)
joblib.dump(scaler, scaler_file)
print(f"模型已保存到: {model_file}")
print(f"标准化器已保存到: {scaler_file}")
print("\n模型保存完成!")
知识点:
- 使用
joblib.dump()保存模型和标准化器 - 保存标准化器很重要,因为预测时需要对输入数据进行相同的标准化
3.6.2 创建预测函数
def predict_virality(feature_array, model=lin_reg, scaler=scaler):
"""
预测文章的强传播力
参数:
feature_array: 文章特征数组(58个特征,不包括Popular列)
model: 训练好的模型(默认使用逻辑回归)
scaler: 标准化器
返回:
prediction: 预测结果(0=非强传播力, 1=强传播力)
probability: 预测概率
"""
# 转换为numpy数组并重塑
X_input = np.array(feature_array).reshape(1, -1)
# 标准化
X_input_scaled = scaler.transform(X_input)
# 预测
prediction = model.predict(X_input_scaled)[0]
probability = model.predict_proba(X_input_scaled)[0]
return prediction, probability
print("预测函数已创建!")
print("\n使用方法:")
print("prediction, prob = predict_virality(feature_array)")
print("prediction: 0=非强传播力, 1=强传播力")
print("prob: [非强传播力概率, 强传播力概率]")
知识点:
- 预测函数应该包含模型加载、数据预处理、预测等完整流程
- 确保预测时的数据格式与训练时一致
3.6.3 预测示例
# 示例1:非强传播力文章特征
input_feature_1 = [13, 1072, 0.415645617, 0.999999999, 0.540889526, 19, 19, 20, 0, 4.682835821,
7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 16000, 3151.157895,
1, 0, 0, 0, 0, 0, 0, 0, 0.02863281, 0.028793552, 0.028575185, 0.028571675,
0.885426778, 0.513502123, 0.281003476, 0.074626866, 0.012126866, 0.860215054,
0.139784946, 0.411127435, 0.033333333, 1, -0.220192308, -0.5, -0.05,
0.454545455, 0.136363636, 0.045454545, 0.136363636, 505]
# 示例2:强传播力文章特征
input_feature_2 = [19, 211, 0.575129531, 0.999999992, 0.663865541, 3, 1, 1, 0, 4.393364929,
6, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 918, 918, 918,
1, 0, 0, 0, 0, 0, 0, 0, 0.217792289, 0.033334457, 0.033351425, 0.033333536,
0.682188294, 0.702222222, 0.323333333, 0.056872038, 0.009478673, 0.857142857,
0.142857143, 0.495833333, 0.1, 1, -0.466666667, -0.8, -0.133333333,
0, 0, 0.5, 0, 10000]
# 预测示例1
pred1, prob1 = predict_virality(input_feature_1)
print("=" * 60)
print("预测示例1")
print("=" * 60)
print(f"预测结果: {'强传播力' if pred1 == 1 else '非强传播力'}")
print(f"预测概率: 非强传播力={prob1[0]:.4f}, 强传播力={prob1[1]:.4f}")
# 预测示例2
pred2, prob2 = predict_virality(input_feature_2)
print("\n" + "=" * 60)
print("预测示例2")
print("=" * 60)
print(f"预测结果: {'强传播力' if pred2 == 1 else '非强传播力'}")
print(f"预测概率: 非强传播力={prob2[0]:.4f}, 强传播力={prob2[1]:.4f}")
4. 关键技术点总结
4.1 无监督学习:K-Means聚类
- K-Means算法:将数据分为K个簇,同一簇内的对象彼此相似
- 轮廓系数:衡量簇内紧密度和簇间分离度,范围在-1到1之间,越接近1越好
- 特征选择:使用关键特征(标题词数、内容词数)可以获得更好的聚类效果
4.2 有监督学习:分类算法
- 逻辑回归:线性分类,可解释性强,训练速度快
- 支持向量机(SVM):通过寻找最优分离超平面进行分类,适合处理非线性问题
- K近邻(KNN):基于实例的学习算法,通过找到最近的K个邻居来进行分类
4.3 数据预处理
- 标准化:使用
StandardScaler将特征缩放到相同尺度 - 数据划分:使用
train_test_split划分训练集和测试集 - 特征选择:选择关键特征可以提高模型性能和可解释性
4.4 模型评估
- 准确率:整体分类正确率
- 混淆矩阵:可视化分类错误情况
- 模型对比:对比不同算法的性能,选择最佳模型
4.5 模型部署
- 模型保存:使用
joblib保存模型和预处理器 - 预测函数:封装完整的预测流程
5. 项目总结与扩展
5.1 主要发现
- K-Means聚类:使用标题词数和内容词数两个关键特征,可以实现较好的聚类效果(轮廓系数0.63)
- 逻辑回归表现最佳:准确率达到约65.23%,适合二分类问题
- 阈值选择很重要:使用shares平均值(而非中位数)作为阈值,准确率从65%提升到79-80%
- 特征标准化很重要:标准化后模型性能显著提升
- 标题和内容长度是关键因素:影响文章传播力的重要特征
5.2 后续改进方向
-
特征工程:
- 创建新特征(如标题/内容比例)
- 特征选择(选择最重要的特征)
- 特征降维(PCA等)
-
模型优化:
- 超参数调优
- 尝试其他算法(随机森林、XGBoost等)
- 集成学习
-
处理数据不平衡:
- 使用SMOTE等技术生成合成样本
- 调整类别权重(class_weight)
-
实际应用:
- 构建Web应用
- 实时预测API
- 批量预测功能
-
分析扩展:
- 分析影响传播力的关键因素
- 提供内容优化建议
- 预测最佳发布时间
6. 参考资料
-
数据集:
- UCI Machine Learning Repository: Online News Popularity Dataset
- 链接:http://archive.ics.uci.edu/ml/datasets/Online+News+Popularity
-
技术文档:
- Scikit-learn官方文档:https://scikit-learn.org/
- Pandas官方文档:https://pandas.pydata.org/
-
相关论文:
- K-Means聚类算法研究
- 社交媒体内容传播预测方法研究
-
代码仓库:
结语
本项目完整展示了从需求界定到模型部署的AI项目周期,通过K-Means聚类和有监督学习算法,我们了解了无监督学习和有监督学习的特点和适用场景。在实际应用中,可以根据具体需求选择合适的模型,并通过特征工程、超参数调优等方法进一步提升性能。
希望本文能够帮助读者理解机器学习在内容传播预测领域的应用,并为实际项目提供参考。如有问题或建议,欢迎交流讨论!
作者:Testopia
日期:2026年1月
标签:#机器学习 #K-Means聚类 #分类算法 #社交媒体 #AI项目周期 #Python
更多推荐


所有评论(0)