【數據分析day07】機器學習入門 & 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')

在這裏插入圖片描述
紅色的線就是預測出來的趨勢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章