主页 > 其他  > 

【数据挖掘】

【数据挖掘】

数据挖掘 目录:1. 数据转换2. 属性选择3. 独立于方案的选择4. 探索空间5. 具体方案的选择6. 离散化数值属性无监督离散化基于熵的离散化其他离散化方法 k-means算法原理算法步骤优缺点优点缺点 代码示例(使用Python和`scikit-learn`库)代码解释确定最优`k`值的方法基于熵的离散化与基于误差的离散化 7. 离散化属性转化成数值属性8. 投影主成分分析(PCA)随机投影偏最小二乘回归(PLS) 9. 从文本到属性向量10. 时间序列11. 抽样12. 数据清洗13. 改进决策树14. 稳健回归15. 检测异常16. 一分类学习17. 多分类转化成二分类18. 嵌套二分法

目录: 1. 数据转换

数据转换是对原始数据进行处理,使其更适合模型训练的过程。常见的数据转换方法包括归一化、标准化、对数变换等。

归一化:将数据缩放到 [0, 1] 区间,公式为 x n o r m = x − x m i n x m a x − x m i n x_{norm}=\frac{x - x_{min}}{x_{max}-x_{min}} xnorm​=xmax​−xmin​x−xmin​​。标准化:将数据转换为均值为 0,标准差为 1 的分布,公式为 x s t d = x − μ σ x_{std}=\frac{x - \mu}{\sigma} xstd​=σx−μ​,其中 μ \mu μ 是均值, σ \sigma σ 是标准差。 2. 属性选择

属性选择旨在从原始特征中挑选出 最具有代表性和区分度的特征,以减少数据维度,提高模型性能和训练效率。常见方法有过滤法(如方差分析、相关系数)、包装法(如递归特征消除)和嵌入法(如决策树中的特征重要性)。

from sklearn.datasets import load_iris from sklearn.feature_selection import SelectKBest, chi2 iris = load_iris() X, y = iris.data, iris.target selector = SelectKBest(score_func=chi2, k=2) X_new = selector.fit_transform(X, y) 3. 独立于方案的选择

这指的是属性选择过程不依赖于具体的学习算法,而是基于数据本身的特征进行选择。例如,使用方差分析选择方差较大的特征,因为方差大的特征可能包含更多信息。

4. 探索空间

在属性选择中,探索空间是指所有可能的特征子集的集合。搜索算法在这个空间中寻找最优的特征子集。例如,穷举搜索会遍历所有可能的子集,但当特征数量较多时,计算复杂度会非常高。

5. 具体方案的选择

根据不同的应用场景和数据特点选择合适的属性选择方法。例如,当数据量较大且特征维度高时,过滤法可能更合适;当希望结合特定模型进行特征选择时,包装法或嵌入法更适用。

6. 离散化数值属性

将连续的数值属性转换为离散的类别属性,可降低数据复杂度,提高模型对数据的理解能力。常见方法有无监督离散化和基于熵的离散化等。

无监督离散化 等宽离散化:将属性值的取值范围划分为若干个等宽的区间。例如,将年龄属性划分为 [0, 10)、[10, 20) 等区间。等频离散化:将属性值划分为若干个区间,使得每个区间内的样本数量大致相等。 基于熵的离散化

基于信息熵来确定最优的划分点,使得划分后的子集信息熵最小。通过不断尝试不同的划分点,选择信息增益最大的划分。

import numpy as np def entropy(y): classes, counts = np.unique(y, return_counts=True) probabilities = counts / len(y) return -np.sum(probabilities * np.log2(probabilities)) def information_gain(X, y, split_point): left_indices = X < split_point right_indices = X >= split_point entropy_before = entropy(y) entropy_left = entropy(y[left_indices]) entropy_right = entropy(y[right_indices]) weight_left = len(y[left_indices]) / len(y) weight_right = len(y[right_indices]) / len(y) entropy_after = weight_left * entropy_left + weight_right * entropy_right return entropy_before - entropy_after # 示例数据 X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) # 寻找最佳划分点 best_split = None best_gain = 0 for split in X: gain = information_gain(X, y, split) if gain > best_gain: best_gain = gain best_split = split print("最佳划分点:", best_split) 其他离散化方法 基于聚类的离散化:使用聚类算法(如 K - Means)将属性值聚类,每个簇作为一个离散类别。 k-means算法

K-means聚类是一种广泛应用的无监督学习算法,用于将数据集划分为k个不同的簇(类别),使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。以下将从原理、算法步骤、优缺点、代码示例等方面详细介绍K-means聚类。

原理

K-means算法的核心思想是通过迭代的方式寻找k个簇的质心(中心点),并将每个数据点分配到距离最近的质心所在的簇中,然后不断更新质心的位置,直到质心不再发生明显变化或达到最大迭代次数。

算法步骤 初始化:随机选择k个数据点作为初始质心。分配数据点:对于数据集中的每个数据点,计算它与每个质心的距离(通常使用欧氏距离),并将其分配到距离最近的质心所在的簇中。更新质心:对于每个簇,计算该簇内所有数据点的均值,将这个均值作为新的质心。重复步骤2和3:不断重复分配数据点和更新质心的过程,直到质心不再发生明显变化或达到最大迭代次数。 优缺点 优点 简单易实现:算法原理简单,易于理解和实现。计算效率高:时间复杂度相对较低,对于大规模数据集具有较好的处理能力。可扩展性强:可以应用于各种领域,如图像分割、客户细分等。 缺点 需要预先指定k值:k值的选择对聚类结果影响较大,但在实际应用中很难确定最优的k值。对初始质心敏感:不同的初始质心选择可能会导致不同的聚类结果,甚至可能陷入局部最优解。对噪声和离群点敏感:噪声和离群点可能会影响质心的计算,从而影响聚类结果。 代码示例(使用Python和scikit-learn库) import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs # 生成示例数据集 X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) # 创建K-means模型并进行聚类 kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0) pred_y = kmeans.fit_predict(X) # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=pred_y, s=50, cmap='viridis') # 绘制质心 centers = kmeans.cluster_centers_ plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5) plt.title('K-means Clustering') plt.show() 代码解释

1

. 数据生成:使用make_blobs函数生成一个包含300个样本、4个簇的二维数据集。 2. 创建K-means模型:使用KMeans类创建一个K-means模型,指定簇的数量为4,使用k-means++方法初始化质心,最大迭代次数为300,重复初始化质心的次数为10。 3. 进行聚类:使用fit_predict方法对数据进行聚类,并返回每个数据点所属的簇的标签。 4. 绘制聚类结果:使用plt.scatter函数绘制数据点,根据所属簇的标签进行着色,同时绘制质心。

确定最优k值的方法 手肘法(Elbow Method):计算不同k值下的簇内误差平方和(SSE),随着k值的增加,SSE会逐渐减小。当k值达到某个点后,SSE的下降速度会明显变缓,这个点对应的k值就是最优的k值。 sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, init='k-means++', max_iter=300, n_init=10, random_state=0) kmeans.fit(X) sse.append(kmeans.inertia_) plt.plot(range(1, 11), sse) plt.title('Elbow Method') plt.xlabel('Number of clusters') plt.ylabel('SSE') plt.show() 轮廓系数法(Silhouette Coefficient):计算每个样本的轮廓系数,轮廓系数越接近1表示样本聚类效果越好。选择轮廓系数最大的k值作为最优的k值。 from sklearn.metrics import silhouette_score silhouette_scores = [] for k in range(2, 11): kmeans = KMeans(n_clusters=k, init='k-means++', max_iter=300, n_init=10, random_state=0) labels = kmeans.fit_predict(X) score = silhouette_score(X, labels) silhouette_scores.append(score) best_k = np.argmax(silhouette_scores) + 2 print("最优的k值:", best_k) 基于决策树的离散化:使用决策树对属性进行划分,每个叶子节点对应一个离散类别。 基于熵的离散化与基于误差的离散化 基于熵的离散化侧重于信息的纯度,通过最大化信息增益来确定划分点。基于误差的离散化则关注划分后的预测误差,例如最小化均方误差来确定划分点。 7. 离散化属性转化成数值属性

可以使用编码的方式将离散属性转换为数值属性,常见的编码方法有:

独热编码(One - Hot Encoding):为每个离散值创建一个二进制向量,只有对应的值为 1,其余为 0。 from sklearn.preprocessing import OneHotEncoder import numpy as np X = np.array([['red'], ['green'], ['blue']]) encoder = OneHotEncoder() X_encoded = encoder.fit_transform(X).toarray() print(X_encoded) 标签编码(Label Encoding):为每个离散值分配一个唯一的整数。 8. 投影

投影是将高维数据映射到低维空间的过程,目的是减少数据维度,同时保留数据的主要特征。常见的投影方法有主成分分析、随机投影和偏最小二乘回归等。

主成分分析(PCA)

通过线性变换将原始数据转换为一组各维度线性无关的主成分,选取方差最大的前 k 个主成分作为新的特征。

from sklearn.decomposition import PCA import numpy as np X = np.array([[1, 2], [3, 4], [5, 6]]) pca = PCA(n_components=1) X_pca = pca.fit_transform(X) print(X_pca) 随机投影

随机生成一个投影矩阵,将高维数据投影到低维空间。该方法计算速度快,适用于大规模数据。

偏最小二乘回归(PLS)

同时考虑自变量和因变量的信息,寻找一组能够最大程度解释自变量和因变量变异的成分进行投影。

9. 从文本到属性向量

将文本数据转换为数值向量,以便机器学习模型处理。常见方法有词袋模型、TF - IDF 模型和词嵌入(如 Word2Vec、GloVe)。

from sklearn.feature_extraction.text import TfidfVectorizer corpus = ['This is the first document.', 'This document is the second document.'] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) print(X.toarray()) 10. 时间序列

时间序列是按时间顺序排列的观测值序列。处理时间序列数据通常涉及到平滑、预测等任务。常见的时间序列模型有 ARIMA、LSTM 等。

11. 抽样

从原始数据集中选取一部分样本作为训练集,常见的抽样方法有随机抽样、分层抽样和欠抽样、过抽样等。欠抽样用于处理类别不平衡问题,减少多数类样本;过抽样则增加少数类样本。

12. 数据清洗

处理数据中的缺失值、异常值和重复值等问题。例如,使用均值、中位数或众数填充缺失值,通过统计方法(如 Z - score)检测和处理异常值。

import pandas as pd import numpy as np data = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, 7, 8]}) data_filled = data.fillna(data.mean()) print(data_filled) 13. 改进决策树

可以通过剪枝(预剪枝和后剪枝)、特征选择、集成学习(如随机森林)等方法改进决策树的性能,避免过拟合。

14. 稳健回归

对异常值具有较强鲁棒性的回归方法,如 RANSAC(随机抽样一致性)、Huber 回归等。

15. 检测异常

通过统计方法(如 Z - score、箱线图)、基于模型的方法(如孤立森林、One - Class SVM)等检测数据中的异常值。

from sklearn.ensemble import IsolationForest import numpy as np X = np.array([[1], [2], [3], [4], [5], [100]]) clf = IsolationForest(contamination=0.1) clf.fit(X) predictions = clf.predict(X) print(predictions) 16. 一分类学习

用于识别属于某一类别的样本,而不需要明确的负类样本。常见的一分类算法有 One - Class SVM、单类高斯模型等。

17. 多分类转化成二分类

将多分类问题转化为多个二分类问题进行求解,常见方法有一对一(One - vs - One)和一对其余(One - vs - Rest)。

18. 嵌套二分法

将多分类问题通过一系列的二分类问题逐步分解,每次将类别集合划分为两个子集,直到每个子集只包含一个类别。

标签:

【数据挖掘】由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【数据挖掘】