【数据挖掘】深度挖掘
【数据挖掘】深度挖掘
- 目录:
- 1. 减少样本集的数量
- 知识点
- 示例
- 2. 对噪声比集剪枝
- 知识点
- 示例
- 建立局部树
- 代码示例(使用 Python 和 `scikit - learn` 库构建局部决策树)
- 代码解释
- 注意事项
- 最大超平面
- 定义
- 原理
- 求解方法
- 代码示例(使用 Python 和 `scikit - learn` 库)
- 代码解释
- 3. 属性加权
- 知识点
- 示例
- 4. 泛化样本集
- 知识点
- 示例
- 5. 用于泛化样本集距离函数
- 知识点
- 示例
- 6. 局部线性模型用于数据预测
- 知识点
- 示例
- 7. 模型树
- 知识点
- 构建树伪代码
- 对树剪枝
- 8. 名目属性
- 知识点
- 示例
- 9. 缺失值
- 知识点
- 示例
- 10. 贝叶斯网络
- 知识点
- 算法细节
- 快速学习数据结构
- 11. 聚类
- 知识点
- 层次聚类
- 增量聚类
- 基于概率聚类,EM 算法
- 扩展混合模型
- 贝叶斯聚类
- 12. 半监督学习
- 知识点
- 用于分类聚类
- 协同训练
- 多实例学习
- 13. 升级学习算法
- 知识点
目录:
1. 减少样本集的数量
知识点
减少样本集数量可以提高计算效率、降低存储成本,避免过拟合等问题。常见方法有随机采样、分层采样、基于密度的采样等。
- 随机采样:随机选择一定比例的样本。
- 分层采样:根据样本的类别分布进行分层,然后在每一层中进行采样,以保证样本类别比例不变。
- 基于密度的采样:去除密度较低区域的样本。
示例
假设我们有一个包含 1000 个样本的数据集,要将其减少到 100 个样本。使用随机采样可以这样实现(Python 示例):
import numpy as np
data = np.random.rand(1000, 10) # 假设数据有 10 个特征
sample_indices = np.random.choice(len(data), 100, replace=False)
reduced_data = data[sample_indices]
2. 对噪声比集剪枝
知识点
噪声比集剪枝是一种处理数据中噪声的方法,通过评估样本的噪声比例,去除噪声较大的样本或对噪声样本进行修正。可以基于样本的预测误差、与邻居样本的差异等指标来判断噪声。
示例
在决策树中,对于某个叶子节点,如果该节点包含的样本中噪声样本比例超过一定阈值,则对该节点进行剪枝。
局部树通常指在特定数据子集或局部区域上构建的树结构模型,比如局部决策树、局部模型树等,以下为你详细介绍构建局部决策树的思路和代码示例:
建立局部树
构建局部树一般按以下步骤进行:
- 选择局部数据:确定要构建局部树的数据子集。这可以基于数据的空间位置、与某个查询点的距离、特定的属性值范围等。
- 定义树结构:明确使用的树类型,如决策树、回归树等,并确定树的节点结构和划分规则。
- 构建树:在选定的局部数据上,根据定义的树结构和划分规则递归地构建树。
代码示例(使用 Python 和 scikit - learn
库构建局部决策树)
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
# 生成示例数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2,
n_redundant=0, n_clusters_per_class=1, random_state=42)
# 选择局部数据(例如,选择特征 0 在 [0, 1] 范围内的数据)
local_indices = np.where((X[:, 0] >= 0) & (X[:, 0] <= 1))[0]
X_local = X[local_indices]
y_local = y[local_indices]
# 构建局部决策树
local_tree = DecisionTreeClassifier(max_depth=3)
local_tree.fit(X_local, y_local)
# 可视化局部决策树的决策边界
disp = DecisionBoundaryDisplay.from_estimator(
local_tree, X_local, response_method="predict",
alpha=0.5,
)
disp.ax_.scatter(X_local[:, 0], X_local[:, 1], c=y_local, edgecolor="k")
plt.title("Local Decision Tree Decision Boundary")
plt.show()
代码解释
- 数据生成:使用
make_classification
函数生成一个二维的分类数据集。 - 选择局部数据:通过
np.where
函数选择特征 0 在[0, 1]
范围内的数据作为局部数据。 - 构建局部决策树:使用
DecisionTreeClassifier
构建一个最大深度为 3 的决策树,并在局部数据上进行训练。 - 可视化决策边界:使用
DecisionBoundaryDisplay
可视化局部决策树的决策边界,并将局部数据点绘制在图上。
注意事项
- 局部数据选择:局部数据的选择方式会影响局部树的性能和适用范围。可以根据具体问题选择合适的局部数据选择策略。
- 树的复杂度:为了避免过拟合,需要控制局部树的复杂度,例如限制树的深度、叶子节点的最小样本数等。
最大超平面
定义
在二分类问题中,如果数据是线性可分的,那么存在无数个超平面可以将不同类别的数据分开。最大超平面是指在这些能够正确分类的超平面中,使得两类数据到该超平面的间隔(margin)最大的那个超平面。
在 n n n 维空间中,超平面可以用方程 w T x + b = 0 \mathbf{w}^T\mathbf{x} + b = 0 wTx+b=0 来表示,其中 w \mathbf{w} w 是超平面的法向量, x \mathbf{x} x 是空间中的点, b b b 是偏置项。对于线性可分的数据集,我们希望找到合适的 w \mathbf{w} w 和 b b b 来确定最大超平面。
原理
最大超平面的目标是最大化两类数据到超平面的间隔。间隔定义为离超平面最近的样本点到超平面的距离的两倍。这些离超平面最近的样本点被称为支持向量(Support Vectors)。
对于一个样本点
x
i
\mathbf{x}_i
xi,它到超平面
w
T
x
+
b
=
0
\mathbf{w}^T\mathbf{x} + b = 0
wTx+b=0 的距离为:
在二分类问题中,假设正类样本的标签
y
i
=
+
1
y_i = +1
yi=+1,
负类样本的标签
y
i
=
−
1
y_i = -1
yi=−1。为了方便计算间隔,我们可以对超平面进行缩放,使得对于支持向量有
y
i
(
w
T
x
i
+
b
)
=
1
y_i(\mathbf{w}^T\mathbf{x}_i + b) = 1
yi(wTxi+b)=1。这样,间隔就可以表示为
2
∥
w
∥
\frac{2}{\|\mathbf{w}\|}
∥w∥2。
因此,求解最大超平面的问题就转化为在满足分类约束条件
y
i
(
w
T
x
i
+
b
)
≥
1
y_i(\mathbf{w}^T\mathbf{x}_i + b) \geq 1
yi(wTxi+b)≥1 (
i
=
1
,
2
,
⋯
,
n
i = 1, 2, \cdots, n
i=1,2,⋯,n)的情况下,最小化
1
2
∥
w
∥
2
\frac{1}{2}\|\mathbf{w}\|^2
21∥w∥2 的优化问题。
求解方法
上述优化问题是一个带约束的 凸二次规划问题,可以使用拉格朗日乘数法将其转化为对偶问题进行求解。引入拉格朗日乘子
α
i
≥
0
\alpha_i \geq 0
αi≥0(
i
=
1
,
2
,
⋯
,
n
i = 1, 2, \cdots, n
i=1,2,⋯,n),
构造拉格朗日函数:
通过对 w \mathbf{w} w 和 b b b 求偏导数并令其为 0,可以得到对偶问题:
求解对偶问题得到拉格朗日乘子 α i \alpha_i αi 后,可以进一步计算出 w \mathbf{w} w 和 b b b 的值,从而确定最大超平面。
代码示例(使用 Python 和 scikit - learn
库)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 生成线性可分的二维数据集
X, y = make_blobs(n_samples=40, centers=2, random_state=6)
# 创建 SVM 分类器并拟合数据
clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
# 绘制最大超平面和间隔边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 创建网格点
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
# 绘制最大超平面和间隔边界
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
# 绘制支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.show()
代码解释
- 数据生成:使用
make_blobs
函数生成一个线性可分的二维数据集。 - 创建 SVM 分类器:使用
svm.SVC
创建一个线性核的 SVM 分类器,并使用fit
方法拟合数据。 - 绘制数据点:使用
plt.scatter
绘制数据点。 - 绘制最大超平面和间隔边界:通过
clf.decision_function
计算每个网格点到超平面的距离,并使用plt.contour
绘制最大超平面和间隔边界。 - 绘制支持向量:使用
clf.support_vectors_
获取支持向量,并使用plt.scatter
绘制支持向量。
3. 属性加权
知识点
属性加权是指为不同的属性分配不同的权重,以突出某些属性在模型中的重要性。可以基于属性的信息增益、相关性等指标来确定权重。
示例
在 k - 近邻算法中,不同属性的权重可以根据其对分类结果的影响来确定。假设我们有两个属性 x 1 x_1 x1 和 x 2 x_2 x2,计算它们的信息增益分别为 I G 1 IG_1 IG1 和 I G 2 IG_2 IG2,则属性权重 w 1 = I G 1 I G 1 + I G 2 w_1=\frac{IG_1}{IG_1 + IG_2} w1=IG1+IG2IG1, w 2 = I G 2 I G 1 + I G 2 w_2=\frac{IG_2}{IG_1 + IG_2} w2=IG1+IG2IG2。
4. 泛化样本集
知识点
泛化样本集是指能够代表整个数据集特征的样本集合,用于训练模型以提高模型的泛化能力。可以通过数据增强、采样等方法来构建泛化样本集。
示例
在图像识别中,对原始图像进行旋转、翻转、缩放等操作,生成新的样本,与原始样本一起构成泛化样本集。
5. 用于泛化样本集距离函数
知识点
距离函数用于衡量样本之间的相似度或距离,在泛化样本集中,常用的距离函数有欧氏距离、曼哈顿距离、余弦相似度等。
- 欧氏距离: d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2} d(x,y)=∑i=1n(xi−yi)2
- 曼哈顿距离: d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x,y)=\sum_{i = 1}^{n}|x_i - y_i| d(x,y)=∑i=1n∣xi−yi∣
- 余弦相似度: s i m ( x , y ) = x ⋅ y ∣ ∣ x ∣ ∣ ⋅ ∣ ∣ y ∣ ∣ sim(x,y)=\frac{x\cdot y}{||x||\cdot||y||} sim(x,y)=∣∣x∣∣⋅∣∣y∣∣x⋅y
示例
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
# 欧氏距离
euclidean_distance = np.linalg.norm(x - y)
# 曼哈顿距离
manhattan_distance = np.sum(np.abs(x - y))
print("欧氏距离:", euclidean_distance)
print("曼哈顿距离:", manhattan_distance)
6. 局部线性模型用于数据预测
知识点
局部线性模型是在局部邻域内使用线性模型进行数据预测。对于一个待预测的样本,首先找到其最近的 k 个邻居样本,然后在这些邻居样本上拟合一个线性模型,最后使用该线性模型进行预测。
示例
假设我们有一个二维数据集,使用局部线性模型预测一个新样本的值(Python 示例):
from sklearn.neighbors import NearestNeighbors
from sklearn.linear_model import LinearRegression
import numpy as np
# 生成数据
X = np.random.rand(100, 2)
y = 2 * X[:, 0] + 3 * X[:, 1] + np.random.randn(100)
# 待预测样本
new_sample = np.array([[0.5, 0.5]])
# 找到最近的 k 个邻居
k = 10
nbrs = NearestNeighbors(n_neighbors=k, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(new_sample)
# 提取邻居样本
neighbor_X = X[indices[0]]
neighbor_y = y[indices[0]]
# 拟合线性模型
model = LinearRegression()
model.fit(neighbor_X, neighbor_y)
# 预测
prediction = model.predict(new_sample)
print("预测值:", prediction)
7. 模型树
知识点
模型树是一种回归树,每个叶子节点包含一个线性模型。在构建模型树时,通过递归划分数据集,使得每个划分区域内的数据可以用一个线性模型来近似。
构建树伪代码
function BuildModelTree(data):
if 满足停止条件(如数据集中样本数少于阈值、误差小于阈值等):
拟合一个线性模型并返回该叶子节点
选择最佳划分属性和划分点
将数据集根据划分点划分为左右子数据集
左子树 = BuildModelTree(左子数据集)
右子树 = BuildModelTree(右子数据集)
返回以当前节点为根,左右子树为子节点的树
对树剪枝
剪枝是为了避免过拟合,常用的剪枝方法有预剪枝和后剪枝。预剪枝在树构建过程中提前停止划分,后剪枝在树构建完成后对节点进行合并或删除。
8. 名目属性
知识点
名目属性是指属性值为离散的、无序的类别,如颜色(红、绿、蓝)、性别(男、女)等。在处理名目属性时,常用的方法有独热编码、标签编码等。
示例
import pandas as pd
data = {'颜色': ['红', '绿', '蓝']}
df = pd.DataFrame(data)
one_hot_encoded = pd.get_dummies(df, columns=['颜色'])
print(one_hot_encoded)
9. 缺失值
知识点
数据中可能存在缺失值,处理缺失值的方法有删除包含缺失值的样本、使用均值/中位数/众数填补、使用预测模型填补等。
示例
import pandas as pd
import numpy as np
data = {'年龄': [20, np.nan, 30], '性别': ['男', '女', np.nan]}
df = pd.DataFrame(data)
# 使用均值填补年龄列的缺失值
df['年龄'] = df['年龄'].fillna(df['年龄'].mean())
# 使用众数填补性别列的缺失值
df['性别'] = df['性别'].fillna(df['性别'].mode()[0])
print(df)
10. 贝叶斯网络
知识点
贝叶斯网络是一种概率图模型,用于表示变量之间的依赖关系。它由节点和有向边组成,节点表示随机变量,有向边表示变量之间的条件依赖关系。通过贝叶斯网络可以进行概率推理和预测。
算法细节
- 结构学习:确定贝叶斯网络的拓扑结构,可以使用基于评分的方法(如贝叶斯信息准则)或基于约束的方法(如条件独立性测试)。
- 参数学习:在确定结构后,估计每个节点的条件概率分布,可以使用最大似然估计或贝叶斯估计。
快速学习数据结构
**
可以使用一些高效的数据结构来加速贝叶斯网络的学习,如树结构、图结构等。例如,使用 Chow - Liu
算法可以在多项式时间内学习到一个近似最优的贝叶斯网络结构。
**
11. 聚类
知识点
聚类是将数据集中的样本划分为不同的组(簇),使得同一簇内的样本相似度高,不同簇之间的样本相似度低。常见的聚类方法有层次聚类、增量聚类、基于概率聚类等。
层次聚类
- 知识点:层次聚类通过不断合并或分裂簇来构建聚类层次结构,分为凝聚式层次聚类(自底向上)和分裂式层次聚类(自顶向下)。
- 示例(Python):
from sklearn.cluster import AgglomerativeClustering
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
clustering = AgglomerativeClustering().fit(X)
print(clustering.labels_)
增量聚类
- 知识点:增量聚类适用于动态数据集,当新样本到来时,不需要重新对整个数据集进行聚类,而是在已有聚类结果的基础上进行更新。
基于概率聚类,EM 算法
- 知识点:基于概率聚类假设数据是由多个概率分布混合而成的,通过估计每个概率分布的参数来进行聚类。EM 算法是一种迭代算法,用于估计混合模型的参数,包括 E 步(期望步)和 M 步(最大化步)。
- 示例(Python):
from sklearn.mixture import GaussianMixture
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
gmm = GaussianMixture(n_components=2).fit(X)
labels = gmm.predict(X)
print(labels)
扩展混合模型
扩展混合模型是对基本混合模型的扩展,如引入更多的参数或更复杂的概率分布。
贝叶斯聚类
贝叶斯聚类使用贝叶斯方法来进行聚类,通过计算每个样本属于不同簇的后验概率来进行聚类。
12. 半监督学习
知识点
半监督学习利用少量的有标签样本和大量的无标签样本进行学习,常见的应用场景有分类和聚类。
用于分类聚类
- 分类:可以使用半监督分类算法,如自训练、协同训练等,利用无标签样本提高分类性能。
- 聚类:半监督聚类可以利用有标签样本的信息来指导聚类过程,使得聚类结果更符合先验知识。
协同训练
- 知识点:协同训练假设数据有两个不同的视图,每个视图可以独立地进行学习。通过交替训练两个分类器,利用一个分类器对无标签样本的预测结果来为另一个分类器提供额外的有标签样本。
多实例学习
- 知识点:多实例学习中,每个样本由多个实例组成,只有样本的标签是已知的,实例的标签未知。目标是学习一个模型来预测样本的标签。
13. 升级学习算法
知识点
升级学习算法是指对现有的学习算法进行改进和优化,以提高算法的性能和效率。可以从算法的复杂度、准确性、鲁棒性等方面进行升级。例如,对决策树算法进行剪枝优化、对神经网络算法进行架构改进等。