scikit-learn 中 Boston Housing 資料集問題解決方案

shadow_D發表於2023-04-13

scikit-learn 中 Boston Housing 資料集問題解決方案

在部分舊教程或教材中是 sklearn,現在【2023】已經變更為 scikit-learn

  • 作用:開源機器學習庫,支援有監督和無監督學習。它還提供了用於模型擬合、資料預處理、模型選擇、模型評估和許多其他實用程式的各種工具。
  • 安裝 pip install scikit-learn

Boston Housing 資料集

此資料集原本應該在 sklearn 中是自帶資料集之一,但在 scikit-learn 1.2 版本由於某些特殊原因被移除,所以無法使用 load_boston() 獲取

解決辦法:既然自帶的資料集沒有 Boston Housing,那就想辦法在網上找到開放式公共資料集,下載後載入到程式中。這也是網上常見的解決方案,大多借助 pandas, scipy, numpy 等方法下載,然後標準化載入資料,供 scikit-learn 使用。

我將表述一下我所有使用的方法:透過從 openml.org 儲存庫下載資料集,我直接使用 fetch_openml()

from sklearn.datasets import fetch_openml

data_x, data_y = fetch_openml(name="boston", version=1, as_frame=True, return_X_y=True, parser="pandas")
  • 其中 name 是資料集在 openml.org 上的名稱
  • version 是版本號,根據 openml.org 上的描述,使用 1 版本是原始資料集,所以我選擇 1 版本,具體根據對應資料集的描述選擇
  • as_frame=True 表示返回 pandas 的 DataFrame 格式,這樣可以直接使用 pandas 的方法進行資料處理
  • return_X_y 表示分別返回特徵和標籤,如果為 False 則返回一個字典【包含特徵和標籤】,如果你想要的是字典格式,可以設定為 False,而且預設也是 False
  • parser 表示用於載入 ARFF 檔案的解析器,預設的是 liac-arff
  • 更復雜的參考官方檔案:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_openml.html#sklearn.datasets.fetch_openml

對 as_frame 分不分,看下面的內容你應該會有熟悉感覺,一般在分配訓練資料和測試資料時都是下面步驟,我實驗需求決定,所以我直接使用 as_frame=True 獲取我想要的資料,如果你需要完整的,可以不使用 as_frame=True

from sklearn.model_selection import train_test_split

train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.3, random_state=1001)

其他問題

使用上面可能會遇見一些問題【TypeError: can't multiply sequence by non-int of type 'float'】,一般是資料集格式問題,我在使用中是使用 numpy 進行調整的

import numpy as np
from sklearn import linear_model

model = linear_model.LinearRegression()
model.fit(train_x, train_y)
pred_y = model.predict(test_x.astype(np.float64))
  • 像是 predict 運算時,需要將 test_x 轉換為 np.float64 型別,反正報錯時會提醒你使用什麼格式的資料,根據情況進行轉換就可以了

上面載入資料集時我使用 parser="pandas" 也是為了避免,sklearn 中有時對 pandas 資料格式的需求

總結

想辦法獲取遠端或離線的資料集,透過 scikit-learn 自帶工具或其他工具【pandas, scipy, numpy 等】載入即可使用,在使用時注意不同情況下使用的資料格式並做出對應調整。

scikit-learn 適用於儲存為 numpy 陣列或 scipy 稀疏矩陣的任何數字資料,因為 scikit-learn 開發中也使用這些工具。比如在上面的報錯中有部分內部程式碼涉及 np,所以使用 numpy 轉化格式就解決了報錯問題。

File /opt/conda/envs/education/lib/python3.8/site-packages/sklearn/utils/extmath.py:189, in safe_sparse_dot(a, b, dense_output)
    187         ret = np.dot(a, b)
    188 else:
--> 189     ret = a @ b

相關文章