1. 程式人生 > >機器學習3-分類及模型驗證

機器學習3-分類及模型驗證

目錄

機器分類

人工分類

人自己來分類:
右邊比左邊大的為1,

       輸入          輸出
--------------   -----
特徵1  特徵2
3         1           0
2         5           1
1         8           1
6         4           0
5         2           0
3         5           1
4         7           1
4        -1          0
------------------
6         8           1
5         1           0

程式碼

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
x = np.array([
    [3, 1],
    [2, 5],
    [1, 8],
    [6, 4],
    [5, 2],
    [3, 5],
    [4, 7],
    [4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
l, r, h = x[:, 0].min() - 1, x[
:, 0].max() + 1, 0.005 b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005 grid_x = np.meshgrid(np.arange(l, r, h), np.arange(b, t, v)) flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()] flat_y = np.zeros(len(flat_x), dtype=int) flat_y[flat_x[:, 0] < flat_x[:, 1]] = 1 grid_y = flat_y.
reshape(grid_x[0].shape) mp.figure('Simple Classification', facecolor='lightgray') mp.title('Simple Classification', fontsize=20) mp.xlabel('x', fontsize=14) mp.ylabel('y', fontsize=14) mp.tick_params(labelsize=10) mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray') mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80) mp.show()

你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

二元分類

假設預測值y = w0+w1x1+w2x2
在這裡插入圖片描述
sigmoid函式:激波函式,將連續域分解為離散域
所以將分類問題線性化:
在這裡插入圖片描述

將預測函式的輸出看做輸入被劃分為1類的概率,擇概率大的類別作為預測結果。
根據預測函式得到損失函式,通過梯度下降演算法,找到極小值情況的w0…wn,然後將測試樣本帶入,測試準確率。
model = lm.LogisticRegression(solver=‘liblinear’, C=1)
solver 設定求解系統方程的演算法型別:

  • liblinear 用於大型線性分類
  • sag 使用隨機平均梯度最小化有限和。
  • saga 支援非強複合目標的快速遞增梯度方法

C為正則強度,取值為0->+∞。較小的值制定了更強的正則化
正則強度參考:https://www.cnblogs.com/jianxinzhou/p/4083921.html
程式碼:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([
    [3, 1],
    [2, 5],
    [1, 8],
    [6, 4],
    [5, 2],
    [3, 5],
    [4, 7],
    [4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
# 邏輯分類器
model = lm.LogisticRegression(
    solver='liblinear', C=1)
model.fit(x, y)
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
grid_x = np.meshgrid(np.arange(l, r, h),
                     np.arange(b, t, v))
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
flat_y = model.predict(flat_x)
grid_y = flat_y.reshape(grid_x[0].shape)
mp.figure('Logistic Classification',
          facecolor='lightgray')
mp.title('Logistic Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
              cmap='gray')
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80)
mp.show()

多元分類


多元分類
   /\
走  不走
           /\
     騎車 不騎車
                   /\
             坐車 不坐車
                           /\
                     開車 不開車
                             ...
                A       B       C
... -> A 1 0.7 0 0.2 0 0.1 -> A
... -> B 0 0.1 1 0.8 0 0.4 -> B
... -> C 0 0.3 0 0.3 1 0.9 -> C


利用分類器模型本身的演算法實現多元分類,如決策樹。
通過組合多個二元分類的預測結果實現多元分類,如邏輯分類器。
... A 1 0 0
... B 0 1 0
... A 1 0 0
... B 0 1 0
... C 0 0 1
... C 0 0 1
        |  |  |
        |  |  v
        |  v 訓練二元分類器Z,其輸出值就是屬於C類的概率
       v 訓練二元分類器Y,其輸出值就是屬於B類的概率
       訓練二元分類器X,其輸出值就是屬於A類的概率
     X     Y      Z
...  0.7  0.4  0.8 -> C
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([
    [4, 7],
    [3.5, 8],
    [3.1, 6.2],
    [0.5, 1],
    [1, 2],
    [1.2, 1.9],
    [6, 2],
    [5.7, 1.5],
    [5.4, 2.2]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
# 建立並訓練邏輯分類器
model = lm.LogisticRegression(
    solver='liblinear', C=100)
model.fit(x, y)
# l,r,h:l=第一列最小值-1,r為第一列最大值+1,h為0.005
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
# b,t,v:b為第二列最小值-1,t第二列最大值+1,v0.005
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
# 根據值畫網格
print(l,r,h,sep=" ")
print(b,t,v,sep=' ')
grid_x = np.meshgrid(np.arange(l, r, h), np.arange(b, t, v))
# ravel():返回其一位陣列的情況。
# np.r_是按列連線兩個矩陣,就是把兩矩陣上下相加,要求列數相等,增加其行數,類似於pandas中的concat()。
# np.c_是按行連線兩個矩陣,就是把兩矩陣左右相加,要求行數相等,增加其列數,類似於pandas中的merge()。
# 上方兩種方法均需要一維陣列,這裡得到所有點的座標
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
flat_y = model.predict(flat_x)
grid_y = flat_y.reshape(grid_x[0].shape)
mp.figure('Logistic Classification',
          facecolor='lightgray')
mp.title('Logistic Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
#根據網格給介面劃分
mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
              cmap='gray')
#將訓練點點上去
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg',
           s=60)
mp.show()

樸素貝葉斯分類

樸素:條件堵路
概率:
P(美女,愛你)=P(美女)P(愛你|美女) // 貝葉斯定理
                           1%           1%
10000個人
100美女
1愛你
X樣本被劃分為C類別的概率:
P(X,C)=
P(x1,x2,x3,C)=P(x1|x2,x3,C)P(x2,x3,C)
     |   \_____/             |  \___/
     v       v                   v v
  愛你      美女                愛你美女
=P(x1|x2,x3,C)P(x2|x3,C)P(x3,C)
=P(x1|x2,x3,C)P(x2|x3,C)P(x3|C)P(C)
   | 樸素:條件獨立,特徵值之間沒有因果關係
   v
=P(x1|C)P(x2|C)P(x3|C)P(C)

根據上面的公式,由訓練資料集中統計得到,某個特定類別©的概率,和該類別條件下各個特徵值(x1,x2,x3)出現的概率,彼此相乘,就得到有這組特徵值構成的樣本(X)被劃分為該類別©的概率。通過比較不同類別的劃分概率,取其最大值作為預測結果。在樣本數不足的時候,如果已知樣本的特徵值服從某種概率分佈規則,可以用其概率密度函式或概率質量函式直接求得針對特定特徵值計算所需要的概率值。

import sklearn.naive_bayes as nb
# 基於正態分佈的樸素貝葉斯分類器
model = nb.GaussianNB()
高斯分佈 = 正態分佈

程式碼:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.naive_bayes as nb
import matplotlib.pyplot as mp
x, y = [], []
with open(r'C:\Users\Cs\Desktop\機器學習\ML\data\multiple1.txt', 'r') as f:
    for line in f.readlines():
        data = [float(substr) for substr in line.split(',')]
        x.append(data[:-1])
        y.append(data[-1])
x = np.array(x)
y = np.array(y, dtype=int)
# 建立樸素貝葉斯分類器模型
model = nb.GaussianNB()
# 訓練樸素貝葉斯分類器模型
model.fit(x, y)
# 點陣水平邊界和步長
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
# 點陣垂直邊界和步長
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
# 生成二維點陣
#             _ grid_x
#   ^ |h|    /
# t | * * * *
#   | * * * *-- v
# b | * * * *--
#   +-------->
#     l     r

grid_x = np.meshgrid(np.arange(l, r, h), np.arange(b, t, v))
# 將點陣中每個點的水平座標和垂直座標作為
# 樣本的兩個特徵合併成一個兩列的二維陣列
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
# 利用樸素貝葉斯分類器模型預測點陣的類別
flat_y = model.predict(flat_x)
# 將一維形式的類別變成點陣形式的二維陣列
grid_y = flat_y.reshape(grid_x[0].shape)
# 將訓練集中的輸入代入模型預測其類別輸出
pred_y = model.predict(x)
# 計算預測正確的比例,python中,True也是1,可以通過int,求和等方式轉換為int格式,
print((pred_y == y).sum() / pred_y.size)
# 繪製訓練樣本和分類邊界
mp.figure('Naive Bayes Classification',
          facecolor='lightgray')
mp.title('Naive Bayes Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
              cmap='gray')
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg',
           s=60)
mp.show()

在這裡插入圖片描述

訓練相關

劃分訓練集和測試集

之前的訓練和測試,總是從同一份樣本中取一部分訓練一部分測試,這裡可以自動劃分訓練集和測試集。

0 80% 20%
1 80% 20%
2 80% 20%
   |   |
   v   v
  訓練 測試
import sklearn.model_selection as ms
ms.train_test_split(輸入集, 輸出集, test_size=測試集比例,
    random_state=隨機種子)
    ->訓練輸入,測試輸入,訓練輸出,測試輸出

在樸素貝葉斯分類中進行測試:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.naive_bayes as nb
import matplotlib.pyplot as mp
import sklearn.model_selection as ms
x, y = [], []
with open(r'C:\Users\Cs\Desktop\機器學習\ML\data\multiple1.txt', 'r') as f:
    for line in f.readlines():
        data = [float(substr) for substr in line.split(',')]
        x.append(data[:-1])
        y.append(data[-1])

x = np.array(x)
y = np.array(y, dtype=int)
train_x, test_x, train_y, test_y=ms.train_test_split(x,y,random_state=7,test_size=0.2)
# 建立樸素貝葉斯分類器模型
model = nb.GaussianNB()
# 訓練樸素貝葉斯分類器模型
model.fit(train_x,train_y)
# 點陣水平邊界和步長
l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
# 點陣垂直邊界和步長
b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
# 生成二維點陣
#             _ grid_x
#   ^ |h|    /
# t | * * * *
#   | * * * *-- v
# b | * * * *--
#   +-------->
#     l     r

grid_x = np.meshgrid(np.arange(l, r, h), np.arange(b, t, v))
# 將點陣中每個點的水平座標和垂直座標作為
# 樣本的兩個特徵合併成一個兩列的二維陣列
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
# 利用樸素貝葉斯分類器模型預測點陣的類別
flat_y = model.predict(flat_x)
# 將一維形式的類別變成點陣形式的二維陣列
grid_y = flat_y.reshape(grid_x[0].shape)
# 將訓練集中的輸入代入模型預測其類別輸出
print(test_x)
pred_y = model.predict(test_x)
# 計算預測正確的比例,python中,True也是1,可以通過int,求和等方式轉換為int格式,
print((pred_y == test_y).
            
           

相關推薦

機器學習3-分類模型驗證

目錄 機器分類 人工分類 二元分類 多元分類 樸素貝葉斯分類 訓練相關 劃分訓練集和測試集 交叉驗證 混淆矩陣 分類報告 基於決策樹的分類 基於投

吳恩達-機器學習(3)-分類、邏輯迴歸、多分類、過擬合

文章目錄 Classification and Representation Classification Hypothesis Representation Decision Boundary

機器學習3-分類演算法

資料集介紹與劃分 資料集的劃分 機器學習一般的資料集會劃分為兩個部分: 訓練資料:用於訓練,構建模型 測試資料:在模型檢驗時使用,用於評估模型是否有效 劃分比例: 訓練集:70% 80% 75% 測試集:30% 20% 30% API sklearn.model_selection.train_te

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之五(第3章 之 EM算法)

ado vpd dea bee OS deb -o blog Oz 機器學習中的概率模型和概率密度估計方法及VAE生成式模型詳解之五(第3章 之 EM算法)

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之六(第3章 之 VI/VB算法)

dac term http 51cto -s mage 18C watermark BE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之二(作者簡介)

AR aca rtu href beijing cert school start ica Brief Introduction of the AuthorChief Architect at 2Wave Technology Inc. (a startup company

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之一(簡介)

價值 新書 The aar 生成 syn TE keras 第一章 A Gentle Introduction to Probabilistic Modeling and Density Estimation in Machine LearningAndA Detailed

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之七(第4章 之 梯度估算)

.com 概率 roc 生成 詳解 time 學習 style BE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?機器學習中的概率模型和概率密度估計方法及V

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之八(第4章 之 AEVB和VAE)

RM mes 9.png size mar evb DC 機器 DG ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

機器學習中的概率模型和概率密度估計方法VAE生成式模型詳解之九(第5章 總結)

ces mark TP 生成 機器 分享 png ffffff images ? ?機器學習中的概率模型和概率密度估計方法及VAE生成式模型詳解之九(第5章 總結)

機器學習3:sigmod函式與分類(啟用函式的來龍去脈)

sigmod函式: sigmod函式是常用的啟用函式,函式特點如上,用來表示分類概率。表面上看,是因為函式曲線正好可以用來描述概率關係0-1之間,並且有無限趨近的特點;實際上,sigmod函式確實與分類概率存在特定的聯絡。 具體分析如下: 在bayes分類中,後驗概率表示為

機器學習(3):基於概率論的分類方法:樸素貝葉斯

概述 優點:在資料較少的情況下仍然有效,可以處理多類別問題。 缺點:對於輸入資料的準備方式較為敏感。 使用資料型別:標稱型資料。 貝葉斯決策理論的核心思想:選擇具有最高概率的決策。 使用條件概率來分類 對於某個資料點x,y: 如果,那麼屬於類別 如果,那麼屬於類

機器學習中的概率模型和概率密度估計方法 VAE生成式模型詳解(之二)

簡介     非監督機器學習(Unsupervised Machine Learning)中的資料分佈密度估計(Density Estimation)、樣本取樣(Sampling)與生成(Generation,或Synthesis,即合成)等幾類任務具有重要的應用價值,這從近

學習筆記——機器學習--多項式分佈Softmax迴歸模型推導

  在一個多分類問題,預測變數y y可以取k k個離散值中的任何一個,即y∈{1,2,⋯,k} y∈{1,2,⋯,k}。 例如:在一個郵件分類系統將郵件分為私人郵件,工作郵件和垃圾郵件。由於y y仍然是一個離散值,這種多分類問題,二分類模型在這裡不太適用。

機器學習經典分類演算法 —— k-近鄰演算法(附python實現程式碼資料集)

目錄 工作原理 python實現 演算法實戰 約會物件好感度預測 故事背景 準備資料:從文字檔案中解析資料 分析資料:使用Matplotlib建立散點圖

機器學習 第二章:模型評估與選擇-總結

但是 交叉 roc曲線 掃描 com ram hidden 技術分享 preview 1、數據集包含1000個樣本,其中500個正例,500個反例,將其劃分為包含70%樣本的訓練集和30%樣本的測試集用於留出法評估,試估算共有多少種劃分方式。 留出法將數據集劃分為兩個互斥的

機器學習分類問題實戰(基於UCI Bank Marketing Dataset)

表示 般的 機構 文件 cnblogs opened csv文件 mas htm 導讀: 分類問題是機器學習應用中的常見問題,而二分類問題是其中的典型,例如垃圾郵件的識別。本文基於UCI機器學習數據庫中的銀行營銷數據集,從對數據集進行探索,數據預處理和特征工程,到學習

機器學習(3):信息論

clas spa strong nbsp 信息熵 機器 ont 應用 信息 1.信息熵 2.相對熵 3.互信息 4.交叉熵及深度學習的應用 機器學習(3):信息論

機器學習(3)——多變量線性回歸

function 包括 ade each pop text times value 應該 【一、多變量線性回歸模型】 多變量線性回歸是指輸入為多維特征的情況。比如: 在上圖中可看出房子的價格price由四個變量(size、number of be

機器學習-KNN分類

pos show sha key borde 不同 簡單的 測試 solid 1. K-近鄰(k-Nearest Neighbors,KNN)的原理 通過測量不同特征值之間的距離來衡量相似度的方法進行分類。 2. KNN算法過程 訓練樣本集:樣本集中每個特征值都