【導(dǎo)讀】本文主要介紹了無監(jiān)督學(xué)習在Python上的實踐,圍繞著無監(jiān)督學(xué)習,講述了當前主流的無監(jiān)督聚類方法:數(shù)據(jù)準備,聚類,K-Means Python實現(xiàn),層次聚類和其Python實現(xiàn),t-SNE聚類,DBSCAN 聚類。并且附上作者自己的經(jīng)驗總結(jié),博文附完整詳細代碼,建議大家收藏學(xué)習! 作者 | Vihar Kurama 編譯 | 專知 整理 | Mandy, Shengsheng
Unsupervised Learning with Python 無監(jiān)督學(xué)習是一類機器學(xué)習技術(shù),用來發(fā)現(xiàn)數(shù)據(jù)中的模式。注意:在無監(jiān)督算法中,數(shù)據(jù)是沒有標注的,即只給出輸入變量(X),不給出相應(yīng)的輸出變量。無監(jiān)督學(xué)習是讓算法自己去發(fā)現(xiàn)數(shù)據(jù)中有趣的結(jié)構(gòu)。 人工智能科學(xué)家Yan Lecun解釋說,無監(jiān)督學(xué)習——讓機器自己學(xué)習,而不必被明確告知他們所做的每件事是對是錯——是“真正的”人工智能的關(guān)鍵。 監(jiān)督學(xué)習VS無監(jiān)督學(xué)習在監(jiān)督學(xué)習中,系統(tǒng)試圖從之前給出的例子中學(xué)習。然而,在無監(jiān)督學(xué)習中,系統(tǒng)試圖直接從給出的示例中找到模式。如果數(shù)據(jù)集被標記了,則是一個監(jiān)督學(xué)習的問題,如果數(shù)據(jù)集沒有被標記,那么它就是一個無監(jiān)督學(xué)習的問題。 左邊的圖像是監(jiān)督學(xué)習的一個例子;我們使用回歸方法找到特征之間的最佳擬合線。右邊的圖像是無監(jiān)督學(xué)習的一個例子;在無監(jiān)督學(xué)習中,輸入是基于特征進行分離的,預(yù)測是基于它屬于哪個簇(cluster)。 重要術(shù)語特征(Feature):用于進行預(yù)測的輸入變量。 預(yù)測(Predictions):當提供輸入示例時,模型的輸出。 示例(Example):數(shù)據(jù)集的一行。一個示例包含一個或多個特征, 可能還有一個標簽。 標簽(Label):特征的結(jié)果。 為無監(jiān)督學(xué)習準備數(shù)據(jù)在本文中,我們使用Iris數(shù)據(jù)集進行第一次預(yù)測。該數(shù)據(jù)集包含一組具有5個屬性的150條記錄,這5個屬性為花瓣長度、花瓣寬度、萼片長度、萼片寬度和類別。Iris Setosa, Iris Virginica和Iris Versicolor是三個類。對于我們的無監(jiān)督算法,我們給出了Iris花的四個特征,并預(yù)測了它屬于哪個類。 我們使用Python中的sklearn庫加載Iris數(shù)據(jù)集,使用matplotlib進行數(shù)據(jù)可視化。下面是用于處理數(shù)據(jù)集的代碼部分。 # Importing Modules from sklearn import datasets import matplotlib.pyplot as plt # Loading dataset iris_df = datasets.load_iris() # Available methods on dataset print(dir(iris_df)) # Features print(iris_df.feature_names) # Targets print(iris_df.target) # Target Names print(iris_df.target_names) label = {0: 'red', 1: 'blue', 2: 'green'} # Dataset Slicing x_axis = iris_df.data[:, 0] # Sepal Length y_axis = iris_df.data[:, 2] # Sepal Width # Plotting plt.scatter(x_axis, y_axis, c=iris_df.target) plt.show() 輸出結(jié)果: ['DESCR', 'data','feature_names', 'target', 'target_names'] ['sepal length (cm)', 'sepal width (cm)','petal length (cm)', 'petal width (cm)'] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] ['setosa' 'versicolor' 'virginica']
圖中:紫羅蘭色表示Setosa,綠色表示Versicolor,黃色表示Virginica 聚類(Clustering)在聚類中,數(shù)據(jù)被分成幾個組。簡單來說:目的是將具有相似特征的群體分開并將它們賦予不同的簇(cluster)中。 可視化的例子, 在上圖中,左邊的圖像是未進行分類的原始數(shù)據(jù),右邊的圖像是聚類的結(jié)果(根據(jù)數(shù)據(jù)的特征對數(shù)據(jù)進行劃分)。當給定一個要預(yù)測的輸入時,它將根據(jù)其特征在簇(cluster)中檢查其所屬哪一個類別,并進行預(yù)測。 Python中的K-Means聚類K-Means是一種迭代聚類算法,旨在找到每次迭代中的局部最大值。由于我們知道涉及3個類,因此我們通過將參數(shù)“n_clusters”傳遞到KMeans模型中,對算法進行編程,將數(shù)據(jù)分組為3個類。 現(xiàn)在隨機的三個樣本點(輸入)被分配到三個簇(cluster)中。然后后面樣本點和這每一個點算一下質(zhì)心距離(centroid distance),然后選出并放入最優(yōu)的簇(cluster)中。然后,重新計算所有簇(cluster)的centroids。 每一個聚類的中心是定義這一組樣本點的特征值的集合,檢查中心特征權(quán)重可以解釋每一個簇(cluster)代表的類型。 我們從sklearn庫中導(dǎo)入KMeans模型,擬合特征并進行預(yù)測。 K-Means在Python中的實現(xiàn): # Importing Modules from sklearn import datasets from sklearn.cluster import KMeans # Loading dataset iris_df = datasets.load_iris() # Declaring Model model = KMeans(n_clusters=3) # Fitting Model model.fit(iris_df.data) # Predicitng a single input predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]]) # Prediction on the entire data all_predictions = model.predict(iris_df.data) # Printing Predictions print(predicted_label) print(all_predictions) 輸出結(jié)果: [0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2] 層次聚類(Hierarchical Clustering)顧名思義,層次聚類是一種構(gòu)建聚類層次結(jié)構(gòu)的算法。該算法從分配給自己簇(cluster)的所有數(shù)據(jù)開始。然后將兩個最近的簇(cluster)連接到同一個簇(cluster)中。最后,當只剩下一個簇(cluster)時,該算法就結(jié)束了。 層次聚類的完成可以用dendrogram來表示?,F(xiàn)在讓我們看一個grain谷粒數(shù)據(jù)層次聚類的例子。 數(shù)據(jù)集地址: https://raw./vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv.
Python中的層次聚類實現(xiàn): # Importing Modules from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt import pandas as pd # Reading the DataFrame seeds_df = pd.read_csv( 'https://raw./vihar/ unsupervised-learning-with-python/master/seeds-less-rows.csv') # Remove the grain species from the DataFrame, save for later varieties = list(seeds_df.pop('grain_variety')) # Extract the measurements as a NumPy array samples = seeds_df.values ''' Perform hierarchical clustering on samples using the linkage() function with the method='complete' keyword argument. Assign the result to mergings. ''' mergings = linkage(samples, method='complete') ''' Plot a dendrogram using the dendrogram() function on mergings, specifying the keyword arguments labels=varieties, leaf_rotation=90, and leaf_font_size=6. ''' dendrogram(mergings, labels=varieties, leaf_rotation=90, leaf_font_size=6, ) plt.show() 輸出結(jié)果: K-Means與層次聚類的區(qū)別
t-SNE聚類它是一種無監(jiān)督學(xué)習可視化的方法。t-SNE表示t-distributed stochastic neighborembedding。 它將高維空間映射到可以可視化的二維或三維空間。具體地說,它通過一個二維或三維點對每個高維對象進行建模,其方式是相似的對象由附近的點建模,而不相似的對象則由高概率的遠點建模。 具體可以查看專知以前的t-SNE詳解: 你真的會用 t-SNE 么?有關(guān) t-SNE 的小技巧 Python中,基于Iris數(shù)據(jù)集的t-SNE聚類實現(xiàn): # Importing Modules from sklearn import datasets from sklearn.manifold import TSNE import matplotlib.pyplot as plt # Loading dataset iris_df = datasets.load_iris() # Defining Model model = TSNE(learning_rate=100) # Fitting Model transformed = model.fit_transform(iris_df.data) # Plotting 2d t-Sne x_axis = transformed[:, 0] y_axis = transformed[:, 1] plt.scatter(x_axis, y_axis, c=iris_df.target) plt.show() 輸出結(jié)果: 其中,紫羅蘭色:Setosa,綠色:Versicolor,黃色:Virginica 這里Iris數(shù)據(jù)集具有四個特征(4d),它被變換并以二維圖形表示。類似地,t-SNE模型可以應(yīng)用于具有n個特征的數(shù)據(jù)集。 DBSCAN聚類DBSCAN(Density-Based Spatial Clusteringof Applications with Noise,具有噪聲的基于密度的聚類方法)是一種流行的聚類算法,用于替代預(yù)測分析中的K-means。它不要求您輸入簇(cluster)的個數(shù)才能運行。但作為交換,你必須調(diào)整其他兩個參數(shù)(eps和min_samples)。 DBSCAN算法的目的在于過濾低密度區(qū)域,發(fā)現(xiàn)稠密度樣本點。跟傳統(tǒng)的基于層次的聚類和劃分聚類的凸形聚類簇不同,該算法可以發(fā)現(xiàn)任意形狀的聚類簇,與傳統(tǒng)的算法相比它有如下優(yōu)點: (1)與K-MEANS比較起來,不需要輸入要劃分的聚類個數(shù); (2)聚類簇的形狀沒有偏倚; (3)可以在需要時輸入過濾噪聲的參數(shù); scikit-learn為eps和min_samples參數(shù)提供了一個默認值,但通常需要對它們進行優(yōu)化。eps是在同一鄰域中考慮的兩個數(shù)據(jù)點之間的最大距離。min_samples指的是簇(cluster)在鄰域中數(shù)據(jù)點數(shù)量的最小數(shù)目。 DBSCAN聚類的Python實現(xiàn): # Importing Modules from sklearn.datasets import load_iris import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN from sklearn.decomposition import PCA # Load Dataset iris = load_iris() # Declaring Model dbscan = DBSCAN() # Fitting dbscan.fit(iris.data) # Transoring Using PCA pca = PCA(n_components=2).fit(iris.data) pca_2d = pca.transform(iris.data) # Plot based on Class for i in range(0, pca_2d.shape[0]): if dbscan.labels_[i] == 0: c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r', marker='+') elif dbscan.labels_[i] == 1: c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g', marker='o') elif dbscan.labels_[i] == -1: c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b', marker='*') plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise']) plt.title('DBSCAN finds 2 clusters and Noise') plt.show() 輸出結(jié)果: 更多無監(jiān)督方法:主成分分析(PCA) 異常檢測(Anomaly detection) 自編碼(Autoencoders) 深度置信網(wǎng)絡(luò)(Deep BeliefNets) Hebbian Learning 生成對抗網(wǎng)絡(luò)(GANs) 自組織映射(Self-Organizingmaps) 原文鏈接: https:///unsupervised-learning-with-python-173c51dc7f03 |
|
來自: LibraryPKU > 《機器學(xué)習》