Python 數據分析重點知識點
本系列不同其他的知識點講解,力求通過例子讓新同學學習用法,幫助老同學快速回憶知識點
可視化系列:
- Python基礎
- 數據分析工具
- 數據處理與分析
- 數據可視化
- 機器學習基礎
五、機器學習基礎
- 了解機器學習概念、分類及常見算法
- 監督學習:使用標注數據,訓練模型預測輸出,如分類、回歸任務。以下應用都是監督學習
- 無監督學習:處理未標注數據,尋找數據模式,如聚類、降維等。
- 模型評估與選擇
- 掌握模型評估指標,使用交叉驗證選最優模型。
- 實踐應用
- 用 scikit-learn 等庫構建簡單機器學習模型解決實際問題。
應用1
# 使用KNN對鳶尾花數據集進行分類
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split#導入鳶尾花數據集并查看數據特征iris=datasets.load_iris()print('數據集結構:',iris.data.shape)# 獲取屬性
iris_x=iris.data
print(iris_x) #對應萼片長度、萼片寬度、花瓣長度和花瓣寬度
# 獲取類別
iris_y=iris.target
print(iris_y) #相應的類型,山鳶尾(Setosa),雜色鳶尾(Versicolor)和維吉尼亞鳶尾(Virginica)
# 劃分成測試集合訓練集
iris_train_x,iris_test_x,iris_train_y,iris_test_y=train_test_split(iris_x,iris_y,test_size=0.2,random_state=0)
#分類器初始化
knn=KNeighborsClassifier()
# 對數據集進行訓練
knn.fit(iris_train_x,iris_train_y)
# 對測試集數據的鳶尾花類型進行預測
predict_result=knn.predict(iris_test_x)
print('測試集大小:',iris_test_x.shape)
print('真實結果:',iris_test_y)
print('預測結果:',predict_result)
#顯示預測精確率
print('預測精確率:',knn.score(iris_test_x,iris_test_y))
應用2
# 使用KNN方法來實現手寫數字識別
# coding=utf-8
import numpy as np
from os import listdirdef loadDataSet():# 獲取訓練數據集print("1.Loading trainSet...")trainFileList=listdir("source/HWdigits/trainSet")trainNum=len(trainFileList)trainX=np.zeros((trainNum,32*32))trainY=[]for i in range(trainNum):trainFile=trainFileList[i]# 將訓練數據集向量化trainX[i,:]=img2vector('source/HWdigits/trainSet/%s'% trainFile,32,32)label=int(trainFile.split('_')[0]) # 讀取文件名的第一位作為標記trainY.append(label)#獲取測試數據集print("2.Loading testSet...")testFileList=listdir("source/HWdigits/testSet")testNum=len(testFileList)testX=np.zeros((testNum,32*32))testY=[]for i in range(testNum):testFile=testFileList[i]# 將測試數據集向量化testX[i,:]=img2vector('source/HWdigits/testSet/%s'% testFile,32,32)label=int(testFile.split('_')[0]) # 讀取文件名的第一位作為標記testY.append(label)return trainX,trainY,testX,testY
def img2vector(filename,h,w):imgVector=np.zeros((1,h*w))fileIn=open(filename)for row in range(h):lineStr=fileIn.readline()for col in range(w):imgVector[0,row*32+col]=int(lineStr[col])return imgVector
def myKNN(testDigit,trainX,trainY,k):numSamples=trainX.shape[0] # shape[0] 代表行,每一行一個圖片,得到樣本個數#計算歐式距離diff=[]for n in range(numSamples):diff.append(testDigit-trainX[n]) # 每個個體差diff=np.array(diff) # 轉變為ndarray# 對差求平方和,然后取和的平方根squaredDiff=diff ** 2squaredDist=np.sum(squaredDiff,axis=1)distance=squaredDist**0.5# 2.按距離進行排序sortedDistIndices=np.argsort(distance)classCount={} # 存放各類的個體數量for i in range(k):#3.按順序讀取標簽voteLabel=trainY[sortedDistIndices[i]]#4.計算該標簽次數classCount[voteLabel]=classCount.get(voteLabel,0)+1# 5.查找出現次數最多的類別,作為分類結果maxCount=0for key,value in classCount.items():if value>maxCount:maxCount=valuemaxIndex=keyreturn maxIndextrain_x,train_y,test_x,test_y=loadDataSet()
numTestSamples=test_x.shape[0]
matchCount=0
print("3.Find the most frequent label int k-nearest...")
print("4.show the result...")
for i in range(numTestSamples):predict=myKNN(test_x[i],train_x,train_y,3)print("result is: %d, real answer is: %d"%(predict,test_y[i]))if predict == test_y[i]:matchCount+=1
accuracy=float(matchCount)/numTestSamples
# 5.輸出結果
print("5. Show the accuracy...")
print(" The total number of errors is: %d"%(numTestSamples-matchCount))
print(" The classsify accuracy is: %.2f%%"%(accuracy*100))
數據集鏈接
應用3
# 使用支持向量機SVM算法對隨機數進行訓練分類
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt#隨機生成兩組數據,并通過(-2,2)距離調整為明顯的0/1兩類
data = np.concatenate((np.random.randn(30, 2) - [-2, 2], np.random.randn(30, 2) + [-2, 2]))
target=[0]*30+[1]*30#建立SVC模型
clf=svm.SVC(kernel='linear')
clf.fit(data,target)#顯示結果
w=clf.coef_[0]
a=-w[0]/w[1]
print('參數 w:',w)
print("參數 a:",a)
print("支持向量機:",clf.support_vectors_)
print("參數 coef_",clf.coef_)#使用結果參數生成分類線
xx=np.linspace(-5,5)
yy=a*xx-(clf.intercept_[0]/w[1])#繪制穿過正支持向量的虛線
b=clf.support_vectors_[0]
yy_Neg=a*xx+(b[1]-a*b[0])
#繪制穿過負支持向量的虛線
b=clf.support_vectors_[-1]
yy_Pos=a*xx+(b[1]-a*b[0])#繪制黑色實線
plt.plot(xx,yy,'r-')
#黑色虛線
plt.plot(xx,yy_Neg,'k--')
plt.plot(xx,yy_Pos,'k--')#繪制樣本散點圖
plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1])
plt.scatter(data[:,0],data[:,1],c=target,cmap=plt.cm.coolwarm)plt.xlabel("x")
plt.ylabel("y")
plt.title("Support Vector Classification")
plt.show()