Python Scikit-learn
*一組簡單有效的工具集
*依賴Python的NumPy,SciPy和matplotlib庫
*開源 可複用
sklearn庫的安裝
DOS視窗中輸入
pip install **
NumPy(開源科學計算庫),SciPy(內建多種數學算法和函數子產品)和matplotlib(提供大量繪圖工具)庫基礎上開發的,是以需要先裝這些依賴庫
安裝順序
SKlearn庫中的标準資料集及基本功能 波士頓房價資料集使用sklearn.datasets.load_boston即可加載相關資料集
return_X_y:表示是否傳回target(即價格),預設為False,隻傳回data(即屬性)。
鸢尾花資料集使用sklearn.datasets.load_iris即可加載相關資料集
參數:return_X_y:若為True,則以(data,target)形式傳回資料;預設為False,表示以字典形式傳回資料全部資訊(包括data和target)
手寫數字資料集
使用sklearn.datasets.load_digits即可加載相關資料集
return_X_y:若為True,則以(data,target)的形式傳回資料;預設為False,表示以字典形式傳回資料全部資訊包括(data和target)
n_calss:表示傳回資料的類别數,如:n_class=5,則傳回0到4的樣本資料
sklearn庫的基本功能
sklearn庫共分為六大部分,分别用于完成
分類任務
回歸任務 聚類任務 降維任務模型選擇
資料預處理
無監督學習:
目标:利用無标簽的資料學習資料的分布或資料與資料間的關系被稱作無監督學習
*有監督學習和無監督學習的最大差別在于資料是否有标簽
無監督學習最常用的場景是 聚類 和 降維
聚類:
根據資料的“相似性”将資料分為多類的過程。
評估不同樣本之間的“相似性”,通常使用的方法就是計算兩個樣本之間的“距離”。使用不同的
方法計算樣本間的距離會關系到聚類結果的好壞。
歐氏距離:
歐氏距離是最常用的一種距離度量方法,源于歐式空間中兩點的距離。
曼哈頓距離:
曼哈頓距離也稱作“城市街區距離”,類似于在城市之中駕車行駛,從一個十字路口到
另一個十字路口的距離。
馬氏距離:
馬氏距離表示資料的協方差距離,是一種尺度無關的度量方式。也就是說馬氏距離會
先将樣本點的各個屬性标準化,在計算樣本間的距離。
夾角餘弦:
餘弦相似度用向量空間中的兩個向量夾角的餘弦值作為衡量兩個樣本差異的大小。
餘弦值越接近1,說明兩個向量夾角也接近0度,表明兩個向量越相似。
以同樣的資料集應用于不同的算法,可能會得到不同的結果,算法所耗費的時間也不盡相同,
這是由算法的特性決定的。
調用sklearn庫的标準函數對不同資料集執行的聚類結果。
sklearn.cluster
sklearn.cluster子產品提供的各聚類算法函數可以使用不同的資料形式作為輸入:
>标準資料輸入格式:[樣本個數,特征個數]定義的矩陣形式。
>相似性矩陣輸入形式:即由[樣本數目]定義的矩陣形式,矩陣中每一個元素為
兩個樣本的相似度,如果DBSCAN,AffinityPropagation(近鄰傳播算法)接受
這種輸入。如果以餘弦相似度為例,則對角線元素全為1.矩陣中每個元素的取值
範圍為[0,1]。
降維:
降維,就是在保持資料所具有的代表性特性或者分布的情況下,将高維資料轉化為
低維資料的過程。
*資料可視化
*精簡資料
聚類和分類都是無監督學習的典型任務,任務之間存在關聯,比如某些高維資料
的分類可以通過降維處理更好的獲得,學術界研究表明代表性的分類算法如k-means
與降維算法如NMF之間存在等價性。
*降維過程也可以被了解成為對資料集的組成成分進行分解(decomposition)的過程,
是以sklearn為降維子產品命名為decomposition,在對降維算法調用需要使用sklearn.decomposition子產品
K-means方法及應用
k-means算法以k為參數,把n個對象分成k個簇,使簇内具有較高的相似度,而簇間的相似度較低。
*随機選擇k個點作為初始的聚類中心。
*對于剩下的點,根據其與聚類中心的距離,将其歸入最近的簇。
*對每個簇,計算所有點的均值作為新的聚類中心。
重複2、3 知道聚類中心不再發生改變。
實驗目的:
通過聚類,了解1999年各個省份的消費水準在國内的情況
技術路線:sklearn.cluster.Kmeans
實作過程:
*使用算法:K-means聚類算法
*實作過程:
資料集檔案擷取:微信公衆号:逍遙的豆子 回複:機器學習 即可獲得部落客機器學習部落格所有代碼及資料集
import numpy as np
from sklearn.cluster import KMeans
def loadData(filePath):
fr = open(filePath,'r+') #r+:讀寫打開一個文本檔案
lines = fr.readlines() #.read()每次讀取整個檔案,通常将檔案内容放到一個字元串變量中
retData = []#reData存儲各項消費資訊 .readlines()一次讀取整個檔案 .readline()每次讀一行
retCityName = [] #用來存儲城市名稱
for line in lines:
items = line.strip().split(",")
retCityName.append(items[0])
retData.append([float(items[i])for i in range(1,len(items))])
for i in range(1,len(items)):
return retData,retCityName
#加載資料,建立K-means算法執行個體,并進行訓練,獲得标簽:
if __name__=='__main__':
data,cityName = loadData('city.txt') #利用loadData方法讀取資料
km = KMeans(n_clusters=3) #建立執行個體
lable = km.fit_predict(data) #調用Kmeans()fit_predict()方法進行計算
expenses = np.sum(km.cluster_centers_,axis=1)
#print(wxpenses)
CityCluster = [[],[],[]] #将城市按label分成設定的簇
for i in range(len(cityName)): #将每個簇的城市輸出
CityCluster[lable[i]].append(cityName[i]) #将每個簇的平均花費輸出
for i in range(len(CityCluster)):
print("Expenses:%.2f" % expenses[i])
print(CityCluster[i])
運作效果:
調用KMeans方法所需參數:
*n_clusters: 用于指定聚類中心的個數
*init:初始聚類中心的初始化方法
*max_iter :最大疊代次數
*一般調用時隻用給出n_clusters即可,init預設是K-means++,max_iter預設是300
其它參數:
*data :加載的資料
*label : 聚類後各資料所屬的标簽
*axis : 按行求和
*fit_predict():計算簇中心以及為簇配置設定序号
DBSCAN方法及應用
DBSCAN密度聚類
DBSCAN算法是一種基于密度的聚類算法:
*聚類的時候不需要預先指定簇的個數
*最終的簇的個數不定
DBSCAN算法将資料點分為三類:
*核心點:在半徑Eps内含有超過MinPts數目的點
*邊界點:在半徑Eps内點的數量小于MinPts,但是落在核心點的鄰域内
*噪音點:既不是核心點也不是邊界點的點
DBSCAN算法流程:
1.将所有點标記為核心點、邊界點或噪聲點;
2.删除噪聲點;
3.為距離在Eps之内的所有核心點之間賦予一條邊;
4.每組連通的核心點形成一個簇;
5.将每個邊界點指派到一個與之關聯的核心點的簇中(哪一個核心點的半徑範圍内)。
舉例:有如下13個樣本點,使用DBSCAN進行聚類
DBSCAN的應用執行個體
資料介紹:
現有大學校園網的日志資料,290條大學生的校園網使用情況資料,資料包括使用者ID,裝置的MAC位址,
IP位址,開始上網時間,停止上網時間,上網時長,校園網套餐等。利用已有資料,分析學生上網的模式。
實驗目的:通過DBSCAN聚類,分析學生上網時間和上網時長的模式。
技術路線:sklearn.cluster.DBSCAN
資料執行個體:
實驗過程:
*使用算法:DBSCAN聚類算法
具體代碼:
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as pyplot
import matplotlib.pyplot as plt
mac2id = dict()
onlinetimes = []
f = open('TestData.txt',encoding='UTF-8')
for line in f:
#讀取每條資料中的mac位址,開始上網時間,上網時長
mac = line.split(',')[2]
onlinetime = int(line.split(',')[6])
starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])
#mac2id是一個字典:key是mac位址 value是對應mac位址的上網時長以及開始上網時間
if mac not in mac2id:
mac2id[mac] = len(onlinetimes)
onlinetimes.append((starttime,onlinetime))
else:
onlinetimes[mac2id[mac]] = [(starttime,onlinetime)]
real_X = np.array(onlinetimes).reshape((-1,2))
#調用DBSCAN方法進行訓練,labels為每個資料的簇标簽
X = real_X[:,0:1]
db = skc.DBSCAN(eps = 0.01,min_samples = 20).fit(X)
labels = db.labels_
#列印資料被記上的标簽,計算标簽為-1,即噪聲資料的比例
print('labels:')
print(labels)
raito = len(labels[labels[:] == -1])/len(labels)
print('Noise raito:',format(raito,'.2%'))
#計算簇的個數并列印,評價聚類效果
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print('Estimated number of clusters:%d'% n_clusters_)
print('Silhouette Coefficient:0.3f'% metrics.silhouette_score(X,labels))
#列印各簇标号以及各簇内資料
for i in range(n_clusters_):
print('Cluster',i,':')
print(list(X[labels == i].flatten()))
plt.hist(X,24)
plt.show()
代碼運作結果:
DBSCAN主要參數:
*eps :兩個樣本被看作鄰居節點的最大距離
*min_samples : 簇的樣本數
*metric:距離的計算方式
例:sklearn.cluster.DBSCAN(eps = 0.5,min_samples = 5,metric = 'educlidean')
降維
降維之PCA:
主成分分析(PCA):
*(Principal Component Analysis)是最常用的一種降維方法,通常用于高維資料集的探索
與可視化,還可以用作資料壓縮和預處理等。
*PCA可以把具有相關性的高維變量合成為線性無關的低維變量,稱為主成分。主成分能夠
盡可能保留原始資料的資訊。
涉及到的相關術語:
方差:是各個樣本和樣本均值的差的平方和的均值,用來度量一組資料的分散程度。
協方差:用于度量兩個變量之間的線性相關程度,若兩個變量的協方差為0,則可認為
二者線性無關。
協方差矩陣:則是由變量的協方內插補點構成的矩陣(對稱陣)
特征向量和特征值:特征向量:矩陣的特征向量是描述資料集結構的非零向量并滿足如下公式
A是方陣,
是特征向量,
是特征值。
主成分分析原理:矩陣的主成分就是其協方差矩陣對應的特征向量,按照對應的特征值大小
進行排序,最大的特征值就是第一主成分,其次是第二主成分,以此類推。
未完待續... ...
本文為部落客學習筆記,轉載需注明來源;
學習視訊所屬:中國大學MOOC 北京理工大學 嵩天 禮欣老師https://www.icourse163.org/course/BIT-1001873001