网络数据的机器学习:监督与无监督学习实践
监督机器学习在网络数据中的应用
在处理网络数据的监督机器学习任务时,数据划分是重要的第一步。由于训练数据较少,且“ABC之友”成员数量有限,我们将
test_size
设置为0.4,这是默认值的两倍。若数据不平衡程度较低,可将其降至0.3或0.2;若希望模型有尽可能多的训练数据,且对其表现有信心,甚至可尝试0.1。本次练习选择了0.4。
以下是数据划分的相关代码:
# 这里假设已经有了X和y数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
此函数将数据按60/40的比例划分,60%的数据用于训练集(
X_train
和
y_train
),40%的数据用于测试集(
X_test
和
y_test
)。若模型在这40%的未见数据上表现良好,则可认为是一个不错的模型。
接下来是模型训练与验证环节。模型训练虽常受关注,但在数据收集和准备好后,它通常是最容易的步骤。不过,通过超参数调优来优化模型,值得投入大量时间和精力。
对于这个简单网络,默认的随机森林模型已达到最优。以下是训练随机森林模型的代码:
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=1337, n_jobs=-1, n_estimators=100)
clf.fit(X_train, y_train)
train_acc = clf.score(X_train, y_train)
test_acc = clf.score(X_test, y_test)
print('train_acc: {} - test_acc: {}'.format(train_acc, test_acc))
这里使用随机森林分类器,需从
sklearn.ensemble
模块导入。随机森林通过集成决策树进行预测,每个集成在训练数据的不同特征上进行训练,最后得出最终预测结果。设置
random_state
可确保结果的可重复性,
n_jobs=-1
表示使用所有CPU进行训练,
n_estimators=100
表示使用100个决策树集成,该参数可进行实验调整。
训练和测试的准确率结果如下:
train_acc: 1.0 - test_acc: 0.9354838709677419
测试集的结果不错,由于类别不平衡,模型因多数类标签占86%,至少应达到86%的准确率,93.5%的结果相当不错。但需注意欠拟合和过拟合问题:若训练和测试准确率都很低,模型可能欠拟合,需更多数据;若训练准确率远高于测试准确率,则可能过拟合。就本次实验而言,在数据有限的情况下,这个结果已足够。
仅关注模型准确率是不够的,还需查看混淆矩阵和分类报告以深入了解模型性能。首先,获取预测结果:
predictions = clf.predict(X_test)
然后导入相关函数:
from sklearn.metrics import confusion_matrix, classification_report, plot_confusion_matrix
查看混淆矩阵:
confusion_matrix(y_test, predictions)
也可进行可视化:
plot_confusion_matrix(clf, X_test, y_test)
混淆矩阵能按类别展示模型的预测效果,从矩阵中可知,有26个非“ABC之友”成员被正确预测,3个“ABC之友”成员也被正确预测,但有2个非成员被误判为成员。
分类报告也很有帮助:
report = classification_report(y_test, predictions)
print(report)
报告显示模型在预测非“ABC之友”成员时表现出色,但在预测革命者时效果欠佳。通过检查预测错误的数据,发现Joly实际是“ABC之友”成员,而Madame Hucheloup因与成员有联系被误判。后续可给Joly正确标注并重新训练模型,对于Madame Hucheloup可保持原样,但需关注。
模型洞察方面,通过模型我们能发现《悲惨世界》中不同类型角色处于不同的网络结构。革命者彼此紧密相连,学生也有密集连接,而其他角色连接较少。随机森林模型还能方便地获取特征重要性:
clf.feature_importances_
将其放入DataFrame更便于排序和可视化:
import pandas as pd
importance_df = pd.DataFrame(clf.feature_importances_, index=X_test.columns)
importance_df.columns = ['value']
importance_df.sort_values('value', ascending=False, inplace=True)
importance_df.head()
可视化特征重要性:
import matplotlib.pyplot as plt
importance_df[0:20].plot.barh(figsize=(10,8)).invert_yaxis()
特征重要性有助于识别可从训练数据中剔除的特征,创建更精简的模型,但本次实验未进行激进的特征选择。
除了检测革命者,网络数据预测还有许多其他应用,如机器人检测和人工放大检测。机器人检测可关注账户年龄、发帖数量等特征;人工放大检测可查看每条推文获得的关注者数量。
无监督机器学习在网络数据中的应用
在机器学习领域,通常有监督学习、无监督学习和强化学习三种类型,有时也会涉及半监督学习等组合。无监督学习仅提供数据(X),不提供答案(y),其目标是让模型自行识别数据中的模式和特征,这些模式和特征可用于其他任务。例如,可使用无监督机器学习自动学习图的特征,并将其转换为嵌入向量,用于监督机器学习的预测任务。
在无监督机器学习中,我们将使用Python库Karate Club。该库是NetworkX的无监督机器学习扩展库,基于NumPy、SciPy等多个开源库构建,提供了处理图结构数据的先进方法,可视为小规模图挖掘研究的利器。
Karate Club有诸多优点:其文档链接到算法的原始研究论文,便于深入了解无监督机器学习模型的原理;模型输出标准化,便于实验不同的嵌入方法,观察其对分类模型的影响;社区检测非常简单,使用其可在少量代码内完成从图到社区识别的过程。
以下是使用无监督机器学习的流程:
1. 安装所需库:
pip install networkx pandas scikit-learn karateclub
- 准备数据和创建图。
- 使用Karate Club进行社区检测和嵌入生成。
- 将生成的嵌入作为训练数据用于监督机器学习任务。
总的来说,监督和无监督机器学习在网络数据处理中各有优势,通过合理运用,能帮助我们更好地理解和分析网络数据。
以下是无监督机器学习的简单流程图:
graph LR
A[提供数据X] --> B[无监督学习模型]
B --> C[识别模式和特征]
C --> D[生成嵌入向量]
D --> E[用于监督学习预测任务]
以下是不同机器学习类型的对比表格:
| 机器学习类型 | 数据提供 | 目标 |
| ---- | ---- | ---- |
| 监督学习 | 数据(X)和答案(y) | 学习预测 |
| 无监督学习 | 数据(X) | 识别数据模式和特征 |
| 强化学习 | - | 通过奖励机制学习最优策略 |
网络数据的机器学习:监督与无监督学习实践
深入探究无监督机器学习在网络数据中的应用
在前面我们已经了解了无监督机器学习的基本概念以及Karate Club库的一些优势,接下来我们进一步探讨如何使用Karate Club进行社区检测和嵌入生成。
社区检测
使用Karate Club进行社区检测非常便捷。以Scalable Community Detection (SCD)为例,以下是简单的操作步骤:
1. 导入必要的库和创建图:
import networkx as nx
from karateclub import SCD
# 创建一个示例图
G = nx.karate_club_graph()
- 使用SCD进行社区检测:
model = SCD()
model.fit(G)
communities = model.get_memberships()
在上述代码中,首先创建了一个示例图
G
,然后初始化
SCD
模型并使用
fit
方法对图进行训练,最后通过
get_memberships
方法获取节点所属的社区。
嵌入生成
Karate Club提供了多种生成图嵌入的方法。以Node2Vec为例,以下是生成嵌入的步骤:
1. 导入必要的库和创建图:
import networkx as nx
from karateclub import Node2Vec
# 创建一个示例图
G = nx.karate_club_graph()
- 使用Node2Vec生成嵌入:
model = Node2Vec()
model.fit(G)
embeddings = model.get_embedding()
这里同样先创建了示例图
G
,然后初始化
Node2Vec
模型并使用
fit
方法进行训练,最后通过
get_embedding
方法获取节点的嵌入向量。
评估与应用
生成的嵌入向量可以作为训练数据用于监督机器学习任务。以下是一个简单的分类示例:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 假设我们有节点的标签
labels = [0] * 10 + [1] * 10 # 示例标签
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(embeddings, labels, test_size=0.2, random_state=42)
# 训练逻辑回归模型
clf = LogisticRegression()
clf.fit(X_train, y_train)
# 预测并评估
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
在这个示例中,我们将生成的嵌入向量作为特征,使用逻辑回归模型进行分类,并评估模型的准确率。
不同应用场景下的机器学习选择
在实际应用中,我们需要根据具体的场景选择合适的机器学习方法。以下是不同场景下的选择建议:
| 应用场景 | 机器学习类型 | 原因 |
| ---- | ---- | ---- |
| 已知类别标签的分类任务 | 监督学习 | 可以利用标签信息进行准确的预测 |
| 未知类别结构的探索 | 无监督学习 | 可以自动发现数据中的模式和结构 |
| 需要实时反馈和优化的任务 | 强化学习 | 通过奖励机制不断优化策略 |
总结与展望
通过本文,我们详细介绍了监督和无监督机器学习在网络数据处理中的应用。监督学习通过提供标签信息进行预测,而无监督学习则专注于发现数据中的潜在模式。Karate Club库为无监督机器学习在图数据处理中提供了强大的工具,使得社区检测和嵌入生成变得更加简单高效。
在未来的研究和应用中,我们可以进一步探索不同机器学习方法的组合,以更好地处理复杂的网络数据。例如,结合半监督学习,利用少量的标签信息和大量的无标签数据进行训练,可能会取得更好的效果。同时,随着图神经网络的发展,我们可以将其与传统的机器学习方法相结合,挖掘网络数据中更深层次的信息。
以下是使用无监督机器学习进行图数据处理的完整流程图:
graph LR
A[安装所需库] --> B[准备数据和创建图]
B --> C[使用Karate Club进行社区检测]
C --> D[使用Karate Club进行嵌入生成]
D --> E[将嵌入作为训练数据]
E --> F[用于监督机器学习任务]
F --> G[评估模型性能]
G --> H[优化和调整]
通过合理运用监督和无监督机器学习,我们能够更好地理解和分析网络数据,为各种实际应用提供有力的支持。希望本文能够帮助读者在网络数据处理中找到合适的方法和工具。
超级会员免费看
14万+

被折叠的 条评论
为什么被折叠?



