機器學習入門 & KNN
機器學習入門
原理
- 定義:機器指的就是電腦。
- 把“人工智能”問題轉換成“計算”問題(電腦善於計算),深度學習有3個方向:“語音識別”,“圖像識別”,“自然語義識別”
- 人工智能時代的真正到來,是量子計算機的商用化
- 我們目前學習的是“數據挖掘”
- 實際做的就是“導包” :from sklearn import svm
機器學習分類
1. 有監督學習(知道結果)
分類 (有限數據)
- 分類計數預測的數據對象是**離散的**。(預測分類)如短信是否爲垃圾短信,用戶是否喜歡電子產品
- K近鄰、樸素貝葉斯、決策樹、SVM
迴歸 (無限數據)
- 迴歸技術預測的數據對象是**連續值**。(預測趨勢)例如溫度變化或時間變化。包括一元迴歸和多元迴歸,線性迴歸和非線性迴歸
- 線性迴歸、邏輯迴歸、嶺迴歸
2. 無監督學習
聚類
- 聚類算法用於在數據中尋找隱藏的模式或分組。
- K-means
3. 半監督學習(不用管)
深度學習
深度學習有3個方向:“語音識別”,“圖像識別”,“自然語義識別”
KNN 基礎知識
k-近鄰算法原理
-
k-Nearest Neighbor,KNN
-
K-近鄰算法採用測量不同特徵值之間的距離方法進行分類
-
歐幾里得距離(多維空間距離)公式:
-
判斷一個點屬於哪個分類,先分別計算出該點和所有已知點的距離,再進行排序,最後取出最小的K個來進行分類判斷 (K默認爲5個)
適用數據範圍:
- 數值型: 只在有限目標集中取值,一般用作“分類”
- 標稱型: 可以從無限的數值集合中取值,主要用作“迴歸”
優缺點&改進
- 優點:精度高、對異常值不敏感、無數據輸入假定。
- 缺點:時間複雜度高、空間複雜度高。
- 改進:因爲很消耗支援,一般不做商用,但可進行優化:
1. 解決計算量大的問題:限定範圍半徑進行剪輯(即取周圍有效半徑的點算距離)
2. 解決樣本不平衡問題:加權重
KNN 用法之:分類
導包:KNeighborsClassifier
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
例子一:電影分類
數據
movie = pd.read_excel('../tests.xlsx', sheet_name=1)
movie
解決中文問題
plt.rcParams['font.sans-serif'] = ['SimHei']
以接吻鏡頭作爲y軸, 武打鏡頭作爲x軸畫散點圖, 0表示動作片, 1表示愛情片
plt.scatter(x=movie.武打鏡頭.values, y=movie.接吻鏡頭.values, c=[0,0,1,0,1,1,])
plt.ylabel('接吻鏡頭')
plt.xlabel('武打鏡頭')
機器學習算法的樣本必須是二維
knn = KNeighborsClassifier()
X_train = movie[['接吻鏡頭', '武打鏡頭']]
y_train = movie['分類情況']
knn.fit(X_train , y_train)
機器訓練完成後,創建一些已知結果的常識數據:X_test (測試數據) & y_test (測試結果)
# 大約在冬季 黑客帝國 葉問, 終結者, 一生有你2019
X_test = np.array([[10, 0], [2, 60], [0, 35], [1, 40],[20, 0])
y_test = np.array(['愛情片', '動作片', '動作片', '動作片', '愛情片'])
把測試數據放到機器學習後的函數中去,生成預測結果 “y_”
y_ = knn.predict(X_test)
y_
觀察可發現預測結果 y_ 和 測試結果 y_test 完全一樣
查看一下“測試數據”和“測試結果”的分數
knn.score(X_test, y_test)
將測試數據和測試結果畫成散點圖,對比之前的散點圖分佈
plt.scatter(x=movie.武打鏡頭.values, y=movie.接吻鏡頭.values, c=[0,0,1,0,1,1,])
plt.ylabel('接吻鏡頭')
plt.xlabel('武打鏡頭')
plt.scatter(X_test[:,1], X_test[:,0])
藍色的點就是後面測試數據產生的點的分類。兩個點距靠近“接吻鏡頭”,3個點靠近“武打鏡頭”
例子二:性別分類
- 根據身高、體重、鞋子尺碼數據對性別分類判斷
“訓練數據”和“訓練結果”
X_train = np.array([[180, 180, 43], [150, 120, 35], [160, 130, 40], [165, 110, 38], [170, 120, 42], [175, 150, 43], [160, 100, 38], [190, 200, 45], [170, 120, 40], [177, 130, 43]])
y_train = np.array(['男', '女', '男', '女', '男', '男', '女', '男', '女', '男'])
機器學習
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
創建(已知結果的的)“測試數據”和“測試結果”
X_test = np.array([[166, 120, 38], [185, 150, 44], [155, 90, 36], [172, 130, 41], [168, 120, 39]])
y_test = np.array(['女', '男', '女', '男', '女'])
預測
y_ = knn.predict(X_test)
y_
查看測試數據和測試結果的打分
knn.score(X_test, y_test)
查看訓練數據和訓練結果的打分
knn.score(X_train, y_train)
例子三:(yuan)鳶尾花分類
- 加利福尼亞大學數據集:http://archive.ics.uci.edu/ml/index.php
已經包含在sklearn數據集中
from sklearn.datasets import load_iris
iris = load_iris()
iris
返回值是字典,包含了多種數據:
我們需要用到"data"和"target"
data = iris['data']
target = iris['target']
查看維度
data.shape
150行,每行4個特徵
從原始數據中切出一部分數據來做預測
from sklearn.model_selection import train_test_split
隨機從原始數據中取出0.2*150 條預測數據
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=1)
這裏將訓練數據和測試數據分成了 8份和2份
機器訓練
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
查看預測,對比“測試結果”
knn.predict(X_test)
查看“測試數據”和“測試結果“得分,對比“訓練數據”和“訓練結果”得分
繪圖
from pandas import DataFrame
df = DataFrame(data=data)
df.plot()
從原始數據中取2個維度:期中一個維度做爲x軸數據,另一維度作爲y軸,畫散點圖(這裏我們取0藍色和1橙色)
data = data[:, 0:2]
data.shape
plt.scatter(data[:,0], data[:,1], c=target)
因爲花的分類是三種(花名),所以是三個顏色
畫分類邊界
1) 取數據(取平面所有點)
處理data
取x軸的最大值和最小值之間的範圍,分成1000份
取y軸的最大值和最小值之間的範圍,分成1000份
x,y = np.linspace(data[:,0].min(), data[:,0].max(), 1000), np.linspace(data[:,1].min(), data[:,1].max(), 1000)
x軸和Y軸兩個線拉起來,相交的地方匯成一個點(X,Y)
# x,y“拉起來”交匯成點
X,Y = np.meshgrid(x,y)
查看數據
display(X, Y)
X.ravel() :變成一維的X[ ]
np.c_() 的效果是:從X[ ]中一個數,從Y[ ]取一個數,形成一個二維的數據
XY就是平面上所有的點
XY = np.c_[X.ravel(), Y.ravel()]
訓練
knn = KNeighborsClassifier()
knn.fit(data, target)
預測,1000*1000,平面上有100萬個點,所以會慢一點
%time y_ = knn.predict(XY)
用了1分25秒(這還只是2維的數據,也就是爲什麼KNN不能商用,太慢)
這裏只能看“訓練數據”和“訓練結果”的得分
knn.score(data, target)
查看knn分類邊界
import time
plt.scatter(data[:,0], data[:,1], c=target)
start = time.time()
plt.scatter(XY[:,0], XY[:,1], c=y_, cmap='rainbow')
end = time.time()
print('花費%s 秒'% ( end - start))
上圖就是knn的邊界,採用的是plt.scatter(),比較慢
下面使用一種較快的繪圖方式:plt.pcolormesh()
plt.pcolormesh(X, Y, y_.reshape(1000, 1000))
或者 :plt.pcolormesh(y_.reshape(1000, 1000)),因爲y_已經包含了“面”的信息
把原始數據放上去,這裏必須把 “X,Y”加上,(座標系)
plt.pcolormesh(X, Y, y_.reshape(1000, 1000))
plt.scatter(data[:,0], data[:,1], c=target, cmap='rainbow')
KNN 用法之:迴歸
- 迴歸用於對趨勢的預測
解決負號“-”顯示報警告問題
plt.rcParams['axes.unicode_minus'] = False
生成樣本數據並繪圖
X_train = np.random.random(100) * 10
y_train = np.sin(X_train)
plt.scatter(X_train, y_train)
因爲這樣的正弦數據太完美了,需要人爲加點噪聲
y_train[::4] += np.random.randn(25) * 0.3
plt.scatter(X_train, y_train)
導包
from sklearn.neighbors import KNeighborsRegressor
建模,訓練()數據要二維,所以用reshape()
knn = KNeighborsRegressor()
knn.fit(X_train.reshape(-1,1), y_train)
查看訓練數據和訓練結果得分
knn.score(X_train.reshape(-1,1), y_train)
生成測試數據:0~10之間取100個點,並變成2維
X_test = np.linspace(0, 10, 100).reshape(-1,1)
預測
y_ = knn.predict(X_test)
繪圖
plt.scatter(X_train, y_train)
plt.plot(X_test, y_, c='r')
紅色的線就是預測出來的趨勢