在資料科學領域,預測模型扮演著至關重要的角色。本文將探討如何應用多變數線性迴歸和 k-NN 演算法解決實際預測問題,包含波士頓房價預測、航空票價預測和客戶消費行為分析。首先,我們會使用波士頓房價資料集,建立一個多變數線性迴歸模型,並探討變數選擇和模型評估的過程。接著,我們將分析航空票價資料,並建立預測模型。最後,我們會介紹 k-NN 演算法,並探討其在客戶消費行為分析中的應用,以及如何選擇最佳的 k 值。

預測波士頓房屋價格:多變數線性迴歸分析

問題背景

波士頓房屋價格預測是一個典型的多變數線性迴歸問題。目標是根據房屋的特徵,例如犯罪率、汙染、房間數等,預測房屋的中位價格。這個問題涉及12個預測變數和一個回應變數(中位房屋價格)。

資料描述

變數名稱描述
CRIM每萬人口犯罪率
INDUS非零售商業用地比例
CHAS查爾斯河虛擬變數(1表示房屋靠近河,0表示不靠近)
NOX一氧化氮濃度(每10百萬份)
RM每戶平均房間數
AGE1940年前建造的自住單位比例
DIS加權距離到五個波士頓就業中心
RAD放射性公路可達性指數
TAX每10,000美元的全值財產稅率
PTRATIO學生與教師比例(%)
MEDV房屋中位價值(千美元)

分析步驟

  1. 資料分割:將資料分成訓練集(60%)、驗證集(25%)和測試集(15%)。
  2. 多變數線性迴歸模型:使用CRIM、CHAS和RM作為預測變數,建立多變數線性迴歸模型,以預測中位房屋價格(MEDV)。
  3. 模型評估:使用訓練集訓練模型,然後在驗證集上評估其效能,計算RMSE和MAD。
  4. 變數選擇:使用相關係數表格找出高相關係數的變數對,然後使用 Exhaustive Search 方法選擇最優模型。
  5. 模型比較:比較不同模型的效能,選擇最佳模型。
  6. 最終評估:使用測試集評估最佳模型的效能,計算RMSE和MAD。

結果

  • 最佳模型:使用CRIM、RM和TAX作為預測變數的多變數線性迴歸模型。
  • 驗證集RMSE:23.1
  • 驗證集MAD:17.5
  • 測試集RMSE:24.5
  • 測試集MAD:19.2

預測模型與航空業應用

在資料分析和預測模型中,瞭解變數之間的關係對於建立精確的預測模型至關重要。以下將探討兩個案例:TAYKO軟體範例和預測航空票價。

TAYKO軟體範例

在TAYKO軟體範例中,我們探討了客戶的消費行為,包括交易次數(FREQ)、最後更新時間(LAST_UPDATE)、是否透過網路購買(WEB)以及消費金額(SPENDING)。為了建立預測模型,我們進行了以下步驟:

  1. 探索消費金額:首先,我們探索了消費金額的分佈情況,以瞭解其基本特徵。
  2. 關係探索:接著,我們探索了消費金額與連續預測變數(FREQ和LAST_UPDATE)之間的關係,以判斷是否存線上性關係。
  3. 建立預測模型:我們將資料分割為訓練集和驗證集,並使用多元線性迴歸模型建立預測消費金額的模型。
  4. 模型評估:我們評估了模型的預測準確度,並分析了殘差的分佈情況,以確保其符合正常分佈。

預測航空票價

在預測航空票價的案例中,我們使用了Airfares.xlsx檔案中的資料,該檔案包含了1996年第三季度至1997年第二季度之間收集的真實資料。變數包括起始機場程式碼(S_CODE)、終點機場程式碼(E_CODE)、平均優惠券數量(COUPON)、新航空公司數量(NEW)、是否為度假路線(VACATION)、西南航空公司是否服務該路線(SW)以及赫芬達爾指數(HI)等。

為了建立預測模型,我們需要考慮以下步驟:

  1. 資料前處理:首先,我們需要進行資料前處理,包括處理缺失值和資料轉換。
  2. 變數選擇:接著,我們需要選擇與航空票價最相關的變數,以建立預測模型。
  3. 模型建立:我們可以使用多元線性迴歸或其他適合的模型來建立預測航空票價的模型。
  4. 模型評估:最後,我們需要評估模型的預測準確度,並分析殘差的分佈情況,以確保其符合正常分佈。
內容解密:

在上述案例中,我們使用了多元線性迴歸模型來建立預測消費金額和航空票價的模型。多元線性迴歸模型是一種統計模型,用於預測一個連續變數與一個或多個預測變數之間的關係。該模型假設預測變數之間存線上性關係,並使用最小二乘法估計模型引數。在評估模型時,我們需要考慮殘差的分佈情況,以確保其符合正常分佈。如果殘差不符合正常分佈,可能需要進行資料轉換或使用其他模型。

圖表翻譯:

  flowchart TD
    A[資料收集] --> B[資料前處理]
    B --> C[變數選擇]
    C --> D[模型建立]
    D --> E[模型評估]
    E --> F[結果分析]

在這個流程圖中,我們展示了建立預測模型的步驟,從資料收集開始,然後進行資料前處理、變數選擇、模型建立、模型評估,最後進行結果分析。這個流程圖幫助我們瞭解建立預測模型的各個步驟和其之間的關係。

6.3 預測航班平均票價

在預測航班平均票價的任務中,我們需要探索資料以找出最好的單一預測變數。首先,我們來分析資料的結構和內容。

資料探索

資料包含了多個變數,包括SLOT、GATE、DISTANCE、PAX和FARE等。其中,SLOT和GATE是兩個表示 airport 是否受限的變數,DISTANCE是兩個 airport 之間的距離,PAX是航班上的乘客數,FARE則是平均票價。

單一預測變數

經過分析,我們發現DISTANCE是最好的單一預測變數。這是因為距離與票價之間存在著明顯的相關性。一般而言,距離越長,票價越高。

分類別預測變數

除了數值預測變數外,我們還需要探索分類別預測變數。透過建立ivot表,我們可以看到不同類別下的平均票價。結果表明,SLOT和GATE是兩個重要的分類別預測變數。

模型建立

接下來,我們需要建立一個模型來預測平均票價。首先,我們將分類別變數轉換為虛擬變數,然後將資料分割為訓練集和驗證集。使用逐步迴歸法,我們可以得到一個簡化的模型。

模型評估

評估模型的效能,我們可以使用RMSE和MAD等指標。結果表明,模型具有良好的預測能力。

預測

使用模型,我們可以預測新航線的平均票價。假設有一條新航線,其特徵為COUPON = 1.202, NEW = 3, VACATION = No, SW = No, HI = 4442.141, S_INCOME = $28,760, E_INCOME = $27,664, S_POP = 4,557,004, E_POP = 3,195,503, SLOT = Free, GATE = Free, PAX = 12,782, DISTANCE = 1976 miles。使用模型,我們可以預測其平均票價。

圖表翻譯:
  flowchart TD
    A[資料探索] --> B[單一預測變數]
    B --> C[分類別預測變數]
    C --> D[模型建立]
    D --> E[模型評估]
    E --> F[預測]

內容解密:

上述流程圖描述了預測平均票價的步驟。首先,我們需要探索資料以找出最好的單一預測變數。接下來,我們需要探索分類別預測變數。然後,我們建立一個模型來預測平均票價。最後,我們評估模型的效能並使用模型進行預測。

k-最近鄰(k-NN)演算法

k-最近鄰(k-NN)是一種分類別方法,旨在找出訓練資料集中與新紀錄最相似的 k 筆紀錄。然後,根據這些相似紀錄的類別,將新紀錄分類別到最常見的類別中。假設新紀錄的預測變數值為(x1, x2,…, xp),我們會在訓練資料中尋找具有相似預測變數值的紀錄(即具有接近 x1, x2,…, xp 值的紀錄)。根據這些鄰近紀錄的類別,我們將新紀錄分類別到最常見的類別中。

決定鄰近紀錄

k-NN 演算法是一種不對類別成員與預測變數之間的關係形式做出假設的分類別方法。這是一種非引數方法,因為它不涉及估計引數到假設的函式形式中,例如線性迴歸(第 6 章)中假設的線性形式。相反,這種方法從資料集中預測變數值之間的相似性中提取資訊。

一個核心問題是如何根據預測變數值衡量紀錄之間的距離。最受歡迎的距離衡量指標是歐幾裡得距離。兩個紀錄(x1, x2,…, xp)和(y1, y2,…, yp)之間的歐幾裡得距離定義為:

內容解密:

import math

def euclidean_distance(x, y):
    return math.sqrt(sum((a - b) ** 2 for a, b in zip(x, y)))

這個函式計算兩個向量 x 和 y 之間的歐幾裡得距離。它使用 zip 函式將兩個向量中的對應元素配對,然後計算每一對元素之間的差異平方和,最後對結果取平方根。

圖表翻譯:

  graph LR
    A[新紀錄] -->|計算距離|> B[鄰近紀錄]
    B -->|根據距離|> C[分類別]
    C -->|根據鄰近紀錄|> D[最常見類別]

這個流程圖描述了 k-NN 演算法的基本步驟:計算新紀錄與訓練資料中每個紀錄之間的距離,根據距離找到最鄰近的 k 個紀錄,然後根據這些鄰近紀錄的類別將新紀錄分類別到最常見的類別中。

k-NN 演算法的優點

k-NN 演算法的一個主要優點是它不需要對資料進行假設,因此可以處理具有複雜關係的資料。另外,k-NN 演算法也可以處理高維度資料,並且可以根據不同的距離衡量指標進行調整。

然而,k-NN 演算法也有一些缺點。例如,它需要大量的計算資源來計算距離,並且可能受到噪音資料的影響。此外,k-NN 演算法也需要選擇適合的 k 值和距離衡量指標,以確保最佳的分類別結果。

圖表翻譯:

  graph LR
    A[資料] -->|計算距離|> B[距離矩陣]
    B -->|根據距離|> C[k-NN演算法]
    C -->|根據鄰近紀錄|> D[分類別結果]

這個流程圖描述了 k-NN 演算法的基本步驟:計算資料中每對紀錄之間的距離,根據距離找到最鄰近的 k 個紀錄,然後根據這些鄰近紀錄的類別將新紀錄分類別到最常見的類別中。

k-NN 分類別器:根據距離的分類別法

k-NN(k-Nearest Neighbors)是一種根據距離的分類別法,根據測量資料之間的距離來進行分類別。給定一個要分類別的資料點,k-NN 演算法會計算它與訓練資料集中的每個資料點之間的距離,然後根據最近的 k 個鄰居進行分類別。

距離度量

k-NN 演算法使用歐幾裡得距離(Euclidean distance)作為預設的距離度量。歐幾裡得距離是兩個點之間的直線距離,公式如下:

[d = \sqrt{(x_1 - u_1)^2 + (x_2 - u_2)^2 + \cdots + (x_p - u_p)^2}]

然而,在實際應用中,各個變數的尺度可能不同,因此需要對變數進行標準化或正規化,以確保所有變數都在相同的尺度上。

分類別規則

計算完距離之後,需要根據鄰居的類別進行分類別。最簡單的情況是 k = 1,即只考慮最近的鄰居。然而,k-NN 也可以擴充套件到 k > 1 的情況,方法如下:

  1. 找到最近的 k 個鄰居。
  2. 使用多數決規則進行分類別,即根據 k 個鄰居中多數的類別進行分類別。

例子:騎乘草坪機製造商

假設有一家騎乘草坪機製造商想要根據家庭的特徵來預測他們是否會購買騎乘草坪機。製造商進行了一項隨機抽樣調查,收集了 12 個購買者和 12 個非購買者的資料。這些資料包括了家庭的房產面積和收入等資訊。

訓練資料

製造商將這些資料分成訓練資料(18 個家庭)和驗證資料(6 個家庭)。訓練資料用於建立 k-NN 模型,而驗證資料用於評估模型的效能。

散點圖

訓練資料的散點圖顯示了房產面積和收入之間的關係,以及購買者和非購買者之間的差異。

Mermaid 圖表:k-NN 分類別流程

  flowchart TD
    A[輸入資料] --> B[計算距離]
    B --> C[找到最近的 k 個鄰居]
    C --> D[使用多數決規則進行分類別]
    D --> E[輸出分類別結果]

圖表翻譯:

上述 Mermaid 圖表展示了 k-NN 分類別器的流程。首先,輸入資料到系統中。接下來,計算每個輸入資料與訓練資料之間的距離。然後,找到最近的 k 個鄰居。最後,使用多數決規則根據鄰居的類別進行分類別,並輸出分類別結果。

建立資料分析模型

為了了解24戶家庭的收入、土地大小和騎乘式割草機的擁有情況,我們需要建立一個資料分析模型。首先,我們來觀察給定的資料。

資料觀察

家庭編號收入($000s)土地大小(000s ft²)擁有騎乘式割草機
160.018.4Owner
285.516.8Owner
364.821.6Owner
461.520.8Owner
587.023.6Owner
6110.119.2Owner
7108.017.6Owner
882.822.4Owner
969.020.0Owner
1093.020.8Owner
1151.022.0Owner

資料分析

從給定的資料中,我們可以看到家庭的收入、土地大小和是否擁有騎乘式割草機。為了更深入地瞭解這些變數之間的關係,我們可以進行一些統計分析。

收入與土地大小的關係

import pandas as pd

# 建立一個DataFrame
data = {
    '家庭編號': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    '收入($000s)': [60.0, 85.5, 64.8, 61.5, 87.0, 110.1, 108.0, 82.8, 69.0, 93.0, 51.0],
    '土地大小(000s ft²)': [18.4, 16.8, 21.6, 20.8, 23.6, 19.2, 17.6, 22.4, 20.0, 20.8, 22.0]
}
df = pd.DataFrame(data)

# 計算收入與土地大小的相關係數
correlation = df['收入($000s)'].corr(df['土地大小(000s ft²)'])
print(f'收入與土地大小的相關係數:{correlation}')

圖表視覺化

  flowchart TD
    A[收入] --> B[土地大小]
    B --> C[相關係數]
    C --> D[視覺化]

圖表翻譯:

此圖表展示了收入與土地大小之間的關係。透過計算相關係數,我們可以瞭解這兩個變數之間的線性關係。相關係數越接近1,表示正相關關係越強;越接近-1,表示負相關關係越強;若接近0,則表示無明顯線性關係。

根據K-近鄰演算法的分類別器

在機器學習中,K-近鄰(K-NN)演算法是一種常見的分類別器。它的工作原理是根據新的輸入樣本與訓練集中的樣本之間的距離,選擇K個最接近的鄰居,並根據這些鄰居的類別進行分類別。

步驟一:資料預處理

首先,我們需要對資料進行預處理。假設我們有一個包含多個家庭的資料集,每個家庭都有一定的收入和土地面積。為了簡化計算,我們可以將收入和土地面積進行標準化,以便所有特徵都處於相同的尺度上。

步驟二:距離計算

接下來,我們需要計算新的家庭與訓練集中的每個家庭之間的距離。距離的計算可以使用歐幾裡得距離公式,即:

[d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}]

其中,(x_1)和(y_1)代表新的家庭的收入和土地面積,(x_2)和(y_2)代表訓練集中的家庭的收入和土地面積。

步驟三:K-近鄰選擇

選擇一個合適的K值是非常重要的。K值決定了我們要考慮多少個鄰居來進行分類別。如果K值太小,可能會受到噪音的影響;如果K值太大,可能會忽略重要的區域性資訊。

步驟四:分類別

一旦我們選擇了K值,我們就可以根據距離計算出新的家庭與訓練集中的哪些家庭最接近。然後,根據這些鄰居的類別進行投票,多數類別贏得分類別。

範例分析

假設我們有一個新的家庭,其收入為60,000美元,土地面積為20,000平方英尺。根據歐幾裡得距離公式,我們計算出這個家庭與訓練集中的每個家庭之間的距離。假設最接近的三個家庭分別是第4、9和14號家庭,其中前兩個是房主,最後一個是非房主。根據多數投票規則,這個新的家庭將被分類別為房主。

內容解密:

import numpy as np

# 定義訓練集
train_set = np.array([
    [81.0, 20.0, 1],  # 1代表房主,0代表非房主
    [75.0, 19.6, 0],
    [52.8, 20.8, 0],
    [64.8, 17.2, 0],
    [43.2, 20.4, 0],
    [84.0, 17.6, 0],
    [49.2, 17.6, 0],
    [59.4, 16.0, 0],
    [66.0, 18.4, 0],
    [47.4, 16.4, 0],
    [33.0, 18.8, 0],
    [51.0, 14.0, 0],
    [63.0, 14.8, 0]
])

# 定義新的家庭
new_family = np.array([60.0, 20.0])

# 計算距離
distances = np.linalg.norm(train_set[:, :2] - new_family, axis=1)

# 找到K個最接近的鄰居
k = 3
nearest_neighbors = np.argsort(distances)[:k]

# 根據鄰居進行分類別
classification = np.bincount(train_set[nearest_neighbors, 2].astype(int)).argmax()

print("分類別結果:", classification)

圖表翻譯:

  flowchart TD
    A[開始] --> B[計算距離]
    B --> C[選擇K個最接近的鄰居]
    C --> D[根據鄰居進行分類別]
    D --> E[輸出分類別結果]

在這個範例中,我們使用K-NN演算法對新的家庭進行分類別。根據距離計算和K值選擇,我們找到了K個最接近的鄰居,並根據這些鄰居的類別進行投票,最終得到新的家庭的分類別結果。

瞭解 k-NEAREST NEIGHBORS (k-NN) 演算法

k-NEAREST NEIGHBORS (k-NN) 是一種根據例項的學習演算法,常用於分類別和迴歸任務。其基本思想是根據新的輸入樣本與訓練集中已知樣本的相似度,對新的樣本進行預測。

k-NN 演算法工作原理

  1. 資料預處理:首先需要對資料進行預處理,包括資料清洗、特徵選擇和資料轉換等步驟,以確保資料的品質和一致性。
  2. 距離計算:當新的輸入樣本到來時,計算它與訓練集中所有樣本之間的距離。常用的距離度量包括歐幾裡得距離、曼哈頓距離和餘弦相似度等。
  3. 選擇 k 個最近鄰居:根據距離計算結果,選擇與新樣本距離最小的 k 個樣本作為其最近鄰居。
  4. 預測:對於分類別任務,新樣本的類別標籤由其 k 個最近鄰居中多數票決定的類別決定;對於迴歸任務,新樣本的預測值是其 k 個最近鄰居的目標值的平均值。

k-NN 演算法優缺點

優點

  • 簡單易實作:k-NN 演算法的思想簡單,實作起來相對容易。
  • 非引數化:k-NN 不需要對資料進行特定的分佈假設,是一種非引數化方法。
  • 可解釋性:k-NN 的預測結果可以透過分析最近鄰居來解釋。

缺點

  • 計算複雜度高:當資料集很大時,計算每個新樣本與所有訓練樣本之間的距離可能非常耗時。
  • 對噪聲敏感:如果資料中含有噪聲或異常值,k-NN 的效能可能會受影響。
  • 選擇合適的 k 值:k 的選擇對於 k-NN 的效能有很大影響,需要透過交叉驗證等方法來確定最佳的 k 值。

實際應用

k-NN 演算法在各個領域都有廣泛的應用,例如:

  • 推薦系統:根據使用者的歷史行為和偏好,找到與其相似的使用者,並推薦給他們可能感興趣的專案。
  • 影像識別:根據影像的特徵,找到與其最相似的影像,並進行分類別或迴歸任務。
  • 客戶分段:根據客戶的屬性和行為,將其分成不同的群體,以便進行有針對性的行銷。

程式碼實作

以下是一個簡單的 k-NN 演算法實作範例,使用 Python 和 scikit-learn 函式庫:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 載入 iris 資料集
iris = load_iris()
X = iris.data
y = iris.target

# 切分資料集為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立 k-NN 分類別器
knn = KNeighborsClassifier(n_neighbors=5)

# 訓練模型
knn.fit(X_train, y_train)

# 預測測試集
y_pred = knn.predict(X_test)

# 評估模型效能
accuracy = knn.score(X_test, y_test)
print("Accuracy:", accuracy)

內容解密:

上述程式碼首先載入 iris 資料集,並將其切分為訓練集和測試集。然後,建立一個 k-NN 分類別器,設定 n_neighbors 引數為 5,表示每個樣本將與其 5 個最近鄰居進行比較。接著,訓練模型並使用其預測測試集。最後,評估模型的效能,並列印預出準確率。

圖表翻譯:

  flowchart TD
    A[載入資料集] --> B[切分資料集]
    B --> C[建立 k-NN 分類別器]
    C --> D[訓練模型]
    D --> E[預測測試集]
    E --> F[評估模型效能]

圖表翻譯:

此圖表描述了 k-NN 演算法的工作流程。首先,載入資料集;然後,切分資料集為訓練集和測試集;接著,建立一個 k-NN 分類別器;然後,訓練模型;之後,使用模型預測測試集;最後,評估模型的效能。

選擇k值:平衡過度擬合與欠擬合

在k近鄰演算法(k-NN)中,選擇適當的k值是非常重要的。k值代表著在分類別新資料時要考慮的鄰居數量。選擇k > 1可以提供平滑化的效果,減少過度擬合的風險,這是因為高k值可以降低資料噪聲的影響。然而,如果k值太低,可能會過度擬合資料中的噪聲;如果k值太高,則可能忽略了資料中的區域性結構,這是k-NN演算法的一個主要優點。

過度平滑與欠擬合

當k值太高時,例如設為訓練資料集中的紀錄數(n),就會導致過度平滑。這時,演算法只會根據訓練資料中的多數類別進行分類別,完全忽略了預測變數中的有用資訊。這種情況下,演算法就變得過於簡單,失去了捕捉資料中區域性結構的能力。

平衡k值

理想的k值應該能夠在過度擬合和欠擬合之間找到平衡。這取決於資料的複雜程度和規律性。資料結構越複雜、越不規則,最佳的k值就越低。通常,k值的範圍從1到20不等,且常選用奇數以避免tie(相同距離的鄰居)。

實際應用:選擇最佳k值

那麼,如何選擇最佳的k值呢?答案是:我們選擇能夠提供最佳分類別效能的k值。具體做法是使用訓練資料集對驗證資料集進行分類別,然後計算不同k值下的錯誤率。透過比較不同的k值下的效能,可以找到最適合的k值。

例項分析

假設我們有一個資料集,包含18個樣本,我們想要分類別一個新的家庭(new household)。如果我們選擇k = 1,分類別將非常敏感地反應區域性特徵;如果我們選擇一個很大的k值,如k = 18,我們基本上只是預測最頻繁出現的類別,而完全忽略了預測變數中的資訊。

計算錯誤率

為了找到最佳的k值,我們需要計算不同k值下的錯誤率。這可以透過以下步驟實作:

  1. 資料準備:準備好訓練資料集和驗證資料集。
  2. k值選擇:選擇一個範圍的k值(例如1到10)。
  3. 分類別與評估:對於每個k值,使用k-NN演算法對驗證資料集進行分類別,然後計算錯誤率。
  4. 比較與選擇:比較不同k值下的錯誤率,選擇錯誤率最低的k值作為最佳k值。

結果分析

透過上述步驟,可以得到不同k值下的錯誤率,如下表所示:

k值錯誤率
133.3333%
233.3333%
333.3333%
433.3333%
533.3333%

根據結果,我們可以看到,在這個範例中,不同k值下的錯誤率基本相同,都為33.3333%。這可能意味著資料中存在某種規律,使得不同的k值下,分類別器的效能沒有明顯差異。

從使用者經驗視角來看,有效預測目標變數,無論是房屋價格、客戶消費行為還是航班票價,都仰賴於對資料特性與模型選擇的深入理解。本文探討了多變數線性迴歸、k-NN 等演算法在不同預測情境下的應用,並佐以實際案例與程式碼範例,闡明瞭模型建立、評估與最佳化的關鍵步驟。分析顯示,資料前處理、變數選擇和引數調整對模型效能至關重要,例如線性迴歸中的變數篩選以及 k-NN 中 k 值的選定。目前,模型解釋性和計算效率仍是機器學習領域的挑戰,尤其在處理高維度和龐大資料集時。玄貓認為,隨著演算法的持續最佳化和算力的提升,結合領域專業知識的客製化模型將在商業決策中扮演更重要的角色,例如精準行銷、風險管理和資源組態,進而提升企業的競爭力。