1. 首先,進行數據挖掘的第一步是數據選擇。在明確了業務需求后,我們需要從各種來源中選擇與需求相關的數據。這些數據可能來自業務原始數據、公開的數據集,或者通過爬蟲從網站上抓取的結構化數據。選擇合適的數據是進行數據挖掘的基礎。
  2. 接下來是數據預處理階段。在這個階段,我們需要對選定的數據進行清洗和處理,以消除其中的噪音和不完整信息。
  3. 完成數據預處理后,我們進入特征工程或數據轉換階段。這個階段的目標是根據所選擇的算法,從預處理好的數據中提取出有意義的特征,并將其轉換為適合特定數據挖掘算法的分析模型。
  4. 然后是數據挖掘階段。在這個階段,我們將使用選定的數據挖掘算法對處理過的數據進行深入分析,以發現其中的模式和關聯。
  5. 最后是解釋與評價階段。在這個階段,我們將對數據挖掘的結果進行解釋和評價,以便將其應用于實際的工作領域。

二、數據挖掘算法簡介

2.1 關聯分析


關聯規則分析的目標是發現數據集中不同屬性之間的關聯。為了達到這個目標,關聯規則算法設置了最小支持度閾值和最小置信度閾值。這些算法致力于在盡可能高效的方式下完成這個任務。

常見的關聯規則算法包括Apriori算法、AprioriTid算法和FP-growth算法。

2.2 分類算法


分類算法的目標是將數據集中的對象分配到預定義的類別中。以下是幾種經典的分類算法:

2.3 回歸分析

回歸分析主要研究因變量(目標)和自變量(預測器)之間的關系。在大數據分析中,回歸分析是一種預測性的建模技術,它通過研究因變量和影響它的自變量之間的回歸模型,來預測因變量的發展趨勢。當有多個自變量時,可以研究每個自變量對因變量的影響強度。

回歸分析的分類如下:

2.4 聚類算法


聚類分析處理的對象集合中,對象的類是未知的。它的目標是將對象集合分組為多個由類似對象組成的簇。聚類分析的方法可以分為以下三類:

三、相關預備知識

3.1 距離(相似度)度量

距離度量可用于在數據挖掘中明確樣本數據相似度,通常可以計算樣本間的距離,如下為常用距離度量的介紹。

樣本數據以如下三個人的身高體重示例:

展示到坐標圖中是這樣的:

曼哈頓距離:?也稱曼哈頓街區距離,就如從街區的一個十字路口點到另一個十字路口點的距離, 二維空間(多維空間按同理擴展)用公式表示為

歐氏距離:表示為點到點的距離。二維空間(多維空間按同理擴展)的公式表示為

閔可夫斯基距離:其實就是距離方法的通用概括,當 p=1 既是曼哈頓距離,當 p=2 既是歐氏距離。當p越大,單一維度的差值對整體的影響就越大。

余弦相關系數

樣本數據視為向量,通過兩向量間的夾角余弦值確認相關性,數值范圍[-1,1]。-1表示負相關,0表示無關,1表示正相關。

余弦相關系數的優缺點:

優點:余弦相似度與向量的幅值無關,只與向量的方向相關,在文檔相似度(TF-IDF)和圖片相似性(histogram)計算上都有它的身影;而且在樣本數值稀疏的時候仍可以使用。

缺點:余弦相似度受到向量的平移影響,上式如果將 x 平移到 x+1, 余弦值就會改變。(可以理解為受樣本的起始標準的影響,接下來介紹的皮爾遜相關系數可以消除這個影響)

皮爾遜相關系數

計算出了樣本向量間的相關性,數值范圍[-1,1]。

考慮計算的遍歷的次數,有一個替代公式可以近似計算皮爾遜相關系數:

皮爾遜相關系數優點:可消除每個分量標準不同(分數膨脹)的影響,具有平移不變性和尺度不變性

3.2 數據標準化

數據中如果各分量的單位尺度差異很大,可以使用數據標準化消除不同分量間單位尺度的影響,,加速模型收斂的效率,常用的方法有三種:

min-max 標準化:將數值范圍縮放到(0,1),但沒有改變數據分布。max為樣本最大值,min為樣本最小值。

z-score 標準化:將數值范圍縮放到0附近, 經過處理的數據符合標準正態分布。u是平均值,σ是標準差。

修正的標準z-score:修正后可以減少樣本數據異常值的影響。將z-score標準化公式中的均值改為中位數,將標準差改為絕對偏差。

其中asd絕對偏差:u為中位數,card(x)為樣本個數

3.3 算法的效果評估方法

四、數據挖掘算法原理及實踐

4.1 Apriori關聯分析算法

模型原理:Apriori算法是一種用于頻繁項集挖掘和關聯規則學習的算法。其主要思想是通過候選生成和剪枝策略發現頻繁項集。它利用了數據集中的項集(items)的先驗知識,通過減少不必要的搜索來提高效率。

使用場景:常用于市場籃子分析,如超市購物籃分析,以發現商品之間的關聯關系。

Python示例代碼:

from mlxtend.frequent_patterns import apriori  
from mlxtend.frequent_patterns import association_rules

# 假設df是包含交易數據的DataFrame,'item'是商品列
frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence",min_threshold=0.7)

4.2 協同過濾推薦算法

基于用戶的協同過濾是通過計算用戶之間的距離找出最相似的用戶(需要將所有的評價數據在讀取在內存中處理進行推薦),并將相似用戶評價過的物品推薦給目標用戶。

而基于物品的協同過濾則是找出最相似的物品(通過構建一個物品的相似度模型來做推薦),再結合用戶的評價來給出推薦結果。算法常用有?修正余弦相似度算法:以物品的評分作為物品的屬性值,通過對比物品i,j的共有的用戶相對評分的計算相關性s(i,j)。

import numpy as np  

# 用戶-物品評分矩陣
ratings = np.array([[5, 3, 0, 1],
[4, 0, 0, 0],
[0, 5, 3, 0],
[0, 4, 5, 5]])

# 計算用戶之間的相似度
def similarity(ratings):
n = ratings.shape[0]
sim = np.zeros((n, n))
for i in range(n):
for j in range(n):
if i != j:
sim[i][j] = np.corrcoef(ratings[i], ratings[j])[0, 1]
return sim

# 基于用戶的協同過濾推薦算法
def user_based_collaborative_filtering(ratings, threshold=0.6):
n = ratings.shape[0]
sim = similarity(ratings)
rec_list = {}
for i in range(n):
for j in range(n):
if i != j and sim[i][j] > threshold:
for k in range(len(ratings[j])):
if ratings[j][k] == 0 and ratings[i][k] != 0:
rec_list[k] = ratings[i][k]
return rec_list

# 獲取推薦結果
rec_list = user_based_collaborative_filtering(ratings)
print(rec_list)

4.3 分類算法

(1)基于物品特征值的KNN分類算法

代碼實現:iris鳶尾花KNN分類算法

...

# KNN核心邏輯手寫
def knn(self, oj_list):
weight_dict = {"Iris-setosa":0.0, "Iris-versicolor":0.0, "Iris-virginica":0.0}
for atuple in oj_list:
weight_dict[atuple[1]] += (1.0 / atuple[0])
rel_class = [(key, value) for key, value in weight_dict.items()]
#print(sorted(rel_class, key=lambda x:x[1], reverse=True))
rel_class = sorted(rel_class, key=lambda x:x[1], reverse=True)[0][0]
return rel_class

...
# 調用sklearn直接實現
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix

# 加載鳶尾花數據集
iris = load_iris()
X = iris.data
y = iris.target

# 劃分數據集為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創建KNN分類器,并設置鄰居數量為3
knn = KNeighborsClassifier(n_neighbors=3)

# 使用訓練數據訓練KNN分類器
knn.fit(X_train, y_train)

# 使用測試數據進行預測
y_pred = knn.predict(X_test)

# 輸出分類器的評估結果
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

前面我們討論的協同推薦算法,需要在用戶生成的各種數據上進行深入分析,因此也被稱為社會化過濾算法。然而,這種算法存在一些明顯的問題,如數據的稀疏性、算法的可擴展性,以及過度依賴用戶數據。為了解決這些問題,我們可以采用基于物品特征值分類的算法。這個算法主要分為兩個步驟:第一步是特征值的選取。這一步是至關重要的,因為它決定了算法的準確性和效率。我們需要挑選出具有代表性且能提供區分度的特征值。以Iris花為例,我們可以選取花萼長度、花萼寬度、花瓣長度和花瓣寬度作為特征值。

第二步是計算距離。在這一步中,我們將測試集與訓練集的特征值進行比較,計算它們之間的曼哈頓距離。通過這種方式,我們可以找到與測試集最相似的k個訓練樣本。然后,我們使用加權后的結果來預測分類。
然而,KNN分類算法也存在一些缺點。首先,它無法對分類結果的置信度進行量化,這意味著我們無法確定分類的準確性。其次,它是一種被動學習的算法,這意味著每次進行測試時都需要遍歷所有的訓練集,這可能導致算法的效率較低。

(2)貝葉斯分類算法

代碼實現:

...
# bayes 核心邏輯手寫
def bayes(self):
#訓練組的條件概率
for word in self.vocabulary:
for category,value in self.prob.items():
if word not in self.prob[category]:
count = 0
else :
count = self.prob[category][word]
#優化條件概率公式
self.prob[category][word] = (count + 1) / (self.total[category] + len(self.vocabulary))

...
# 調用sklearn實現
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd

# 假設你有一個文本數據集,存儲在CSV文件中,有兩列:'text'和'label'
data = pd.read_csv('text_data.csv')

# 提取特征和標簽
X = data['text'].values
y = data['label'].values

# 切分數據集為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用CountVectorizer將文本轉換為向量
vectorizer = CountVectorizer()
X_train_transformed = vectorizer.fit_transform(X_train)
X_test_transformed = vectorizer.transform(X_test)

# 使用樸素貝葉斯分類器進行訓練
classifier = MultinomialNB()
classifier.fit(X_train_transformed, y_train)

# 對測試集進行預測
y_pred = classifier.predict(X_test_transformed)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

貝葉斯分類算法是基于概率的分類算法。相比于KNN分類算法,它是主動學習的算法,它會根據訓練集建立一個模型,并用這個模型對新樣本進行分類,速度也會快很多。

貝葉斯分類算法的理論基礎是基于條件概率的公式(應用于現實中P(X|Y&Z)不直觀得出,而P(Y|X)*P(Z|X)比較直觀得出),并假設已存在的子事件(y,z…實際應用中會有多個)間是相互獨立的(因此也稱為樸素貝葉斯),當y,z事件假設為獨立便有:

如下舉例推測買牛奶和有機食品,再會買綠茶的概率:

第一步:計算先驗概率及條件概率

先驗概率:為單獨事件發生的概率,如P(買綠茶),P(有機食品)

條件概率(后驗概率):y事件已經發生,觀察y數據集后得出x發生的概率。如P(買有機食品|買綠茶),通過以下公式計算(nc表示y數據集下x的發生頻數,n為y數據集的總數):

上式存在一個缺陷,當一個條件概率 P(y|x)為0時,整體的預測結果P(x) * P(y|x) * P(z|x)只能為0,這樣便不能更全面地預測。

修正后的條件概率:(公式摘自Tom Mitchell《機器學習》。m是一個常數,表示等效樣本大小。決定常數m的方法有很多,我們這里可以使用預測結果的類別來作為m,比如投票有贊成和否決兩種類別,所以m就為2。p則是相應的先驗概率,比如說贊成概率是0.5,那p(贊成)就是0.5。):

第二歩:根據貝葉斯公式做出預測

由公式計算比較y&z事件發生下,不同x事件發生的概率差異,如得出P(x=喜歡),P(x=不喜歡) 的概率大小,預測為概率比較大的事件。因為P(y)*p(z)在上式都一樣,因此公式可以簡化為計算概率最大項而預測分類:


貝葉斯算法的優點:能夠給出分類結果的置信度;它是一種主動學習算法,速度更快。

貝葉斯算法的缺點:需要特定格式;數值型數據需要轉換為類別計算概率或用高斯分布計算概率;

(3)神經網絡(DNN)分類算法

代碼實現 :

import tensorflow as tf  
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt
import cv2

# 加載數據集,這里我們使用的是MNIST數據集,你可以替換成自己的數據集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

# 對數據進行歸一化處理
train_images = train_images / 255.0
test_images = test_images / 255.0

# 構建DNN模型
model = models.Sequential()
model.add(layers.Dense(512, activation='sigmoid', input_shape=(28, 28))) # 輸入層,28x28是MNIST圖片的大小
model.add(layers.Dense(512, activation='sigmoid')) # 隱藏層
model.add(layers.Dense(10, activation='softmax')) # 輸出層,10個類別,使用softmax激活函數進行多分類

# 編譯模型,設置損失函數、優化器和評估指標
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 訓練模型
model.fit(train_images, train_labels, epochs=5)

# 在測試集上評估模型性能
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)

# 使用模型進行預測并可視化結果
predictions = model.predict(test_images)
predicted_class = np.argmax(predictions, axis=1) # 獲取預測類別
true_class = np.argmax(test_labels, axis=1) # 獲取真實類別
plt.figure(figsize=(10, 5))
for i in range(len(test_images)):
plt.subplot(1, 2, i+1)
plt.imshow(test_images[i].reshape(28, 28), cmap='gray')
plt.title('Predicted: ' + str(predicted_class[i]) + ', True: ' + str(true_class[i]))
plt.show()

DNN分類算法實現了輸入圖片特征向量X,輸出Y(范圍0~1)預測X的分類。

第一步,得到關于X線性回歸函數

可以通過線性回歸得到WX + b,其中W是權重,b是偏差值。但不能用本式表述預測的值,因為輸出Y的值需要在(0~1)區間;

第二歩,通過激活函數轉換

激活函數的特點是可以將線性函數轉換為非線性函數,并且有輸出值有限,可微分,單調性的特點。本例使用sigmoid,使輸出為預測值Y=sigmoid(WX+b);

多個神經網絡層,也就是重復第一、二步,類似sigmoid(sigmoid(WX+b))..的復合函數。

第三歩,構建Cost函數

訓練W,b更好的預測真實的類別需要構建Cost代價函數,y^為sigmoid(WX+b)的預測分類值,y為實際分類值(0或者1):

其中L(y^,y)稱為損失函數

訓練的目的就是為了讓L(y^,y)足夠小,也就是當y實際分類值為1時,y^要盡量偏向1。y實際分類值為0時,y^盡量小接近0。

第四步,梯度下降得到Cost函數的極小值

通過對W,b兩個參數求偏導,不斷迭代往下坡的的位置移動(對w,b值往極小值方向做優化,其中α為學習率控制下降的幅度),全局最優解也就是代價函數(成本函數)J (w,b)這個凸函數的極小值點。

第五步、通過訓練好的W,b預測分類。

4.4 聚類算法

(1)層次聚類

層次聚類將每條數據都當作是一個分類,每次迭代的時候合并距離最近的兩個分類,直到剩下一個分類為止。

代碼實現:

from sklearn.cluster import AgglomerativeClustering  
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成樣本數據
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 實例化層次聚類模型,n_clusters為聚類數
cluster = AgglomerativeClustering(n_clusters=4)

# 擬合數據
cluster.fit(X)

# 獲取聚類標簽
labels = cluster.labels_

# 繪制結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()


(2)K-means++聚類

注:Kmean算法與Kmean++區別在于初始的中心點是直接隨機選取k各點。

代碼實現:

from sklearn.cluster import KMeans  
from sklearn import datasets
import matplotlib.pyplot as plt

# 加載Iris數據集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 創建KMeans實例并擬合數據
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# 獲取聚類標簽和聚類中心點
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

# 繪制聚類結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=300) # 繪制聚類中心點
plt.show()

k-means++算法可概括為:

(1)基于各點到中心點得距離分量,依次隨機選取到k個元素作為中心點:先隨機選擇一個點。重復以下步驟,直到選完k個點。

計算每個數據點dp(n)到各個中心點的距離(D),選取最小的值D(dp);

根據D(dp)距離所占的份量來隨機選取下一個點作為中心點。

(2)根據各點到中心點的距離分類;

(3)計算各個分類新的中心點。重復(2、3),直至滿足條件。

文章轉自微信公眾號@算法進階

上一篇:

系統總結!機器學習的模型!

下一篇:

挑戰Transformer!Mamba的架構及實現(Pytorch)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費