[TQC+][Python][PML3]人工智慧:機器學習-302.波士頓房價

文、意如

題目:
  1. 請撰寫一程式,讀取sklearn.datasets中的波士頓房價(Boston)資料集,此資料集有504筆資料,每筆資料有14個屬性如下:
欄位說明
CRIM按城鎮劃分的人均犯罪率
ZN超過25,000平方英尺的土地劃為住宅用地的比例
INDUS城鎮非零售商用土地的比例
CHASCharles River虛擬變數(如果靠近河流,則為1;否則為0)
NOX一氧化氮濃度(以百萬分之幾為單位)
RM每個住宅的平均房間數
AGE1940年之前建造自有單位的比例
DIS到五個波士頓就業中心的加權距離
RAD徑向公路的可達性指數
TAX每10,000美元的全值財產稅率
PTRATIO城鎮的師生比例
B1000(Bk-0.63)^ 2,其中Bk是按城鎮劃分的黑人比例
LSTAT低階人口狀況百分比
MEDV自有住房的中位數價格(單位為1000美元)

 

  1. 請建立一個線性迴歸機器學習模型,用此資料集中的'CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT'來預測'MEDV'欄位。
  2. 請將資料集分為訓練集與測試集,其中測試集占20%,random_state=1。
  3. 列印此一模型的平均絕對誤差(mean absolute error, MAE)、均方誤差(mean squared error, MSE)、均方根誤差(root-mean-square error, RMSE),並依據輸入值進行房價預測。

(三)、 請依序回答下列問題:

  1. 請填入測試資料集的平均絕對誤差MAE(四捨五入取至小數點後第四位)?
  2. 請填入測試資料集的均方誤差MSE(四捨五入取至小數點後第四位)?
  3. 請填入測試資料集的均方根誤差RMSE(四捨五入取至小數點後第四位)?
  4. 輸入資料為[0.00632, 18.00, 2.310, 0, 0.5380, 6.5750, 65.20, 4.0900, 1, 296.0, 15.30, 396.90, 4.98]。請填入預測房價(四捨五入取至小數點後第四位)?
MLD03.py
#from sklearn import datasets
#from sklearn.model_selection import cross_val_predict
#from sklearn import linear_model
# TODO
from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data.T, ['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT']) #有13個feature
# TODO
# MEDV即預測目標向量
# TODO
X = df[['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT']]
y = df['MEDV']

#分出20%的資料作為test set
# TODO


#Fit linear model 配適線性模型


# TODO
print('MAE:'              )
print('MSE:'              )
print('RMSE:'             )

#  ([[0.00632, 18.00, 2.310, 0, 0.5380, 6.5750, 65.20, 4.0900, 1, 296.0, 15.30, 396.90 , 4.98]])
prediction = lm.predict(X_new)
print(         )
參考解答:
import pandas as pd
from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data.T, ['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT']) #有13個feature
df = df.T
# MEDV即預測目標向量
df['MEDV'] = pd.Series(boston.target)
X = df[['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT']]
y = df['MEDV']
#分出20%的資料作為test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
#Fit linear model 配適線性模型
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
from sklearn.metrics import mean_absolute_error, mean_squared_error
test_MAE = mean_absolute_error(y_test, model.predict(X_test))
test_MSE = mean_squared_error(y_test, model.predict(X_test))
test_RMSE = (test_MSE)**0.5
print(f'MAE: {test_MAE:.4f}')
print(f'MSE: {test_MSE:.4f}')
print(f'RMSE: {test_RMSE:.4f}')

inp = [[0.00632, 18.00, 2.310, 0, 0.5380, 6.5750, 65.20, 4.0900, 1, 296.0, 15.30, 396.90 , 4.98]]
print(f"預測房價: {model.predict(inp)[0]:.4f}")
程式解析:
# 匯入 pandas,用來進行資料處理
import pandas as pd

# 從 sklearn 載入波士頓房價資料集(注意:此資料集已在 sklearn 中標示為 deprecated)
from sklearn.datasets import load_boston
boston = load_boston()  # 載入資料集

# 將原始資料轉置後轉成 DataFrame(13 個特徵),設定每列的欄位名稱
df = pd.DataFrame(boston.data.T, ['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT'])

# 再次轉置,讓每一列代表一筆資料(行:樣本,列:特徵)
df = df.T

# 將房價(目標值 MEDV)加到 DataFrame 中作為最後一欄
df['MEDV'] = pd.Series(boston.target)

# X 是輸入特徵(13 欄),y 是目標值(房價)
X = df[['CRIM','ZN','INDUS','CHAS','NOX','RM' ,'AGE','DIS','RAD','TAX', 'PTRATIO','B','LSTAT']]
y = df['MEDV']

# 匯入 train_test_split 用來切分資料集
from sklearn.model_selection import train_test_split

# 將資料集分成訓練組與測試組,測試組佔 20%,設定隨機種子為 1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

# 匯入線性回歸模型
from sklearn.linear_model import LinearRegression

# 建立線性回歸模型
model = LinearRegression()

# 使用訓練資料來訓練模型
model.fit(X_train, y_train)

# 匯入評估模型用的指標:MAE、MSE
from sklearn.metrics import mean_absolute_error, mean_squared_error

# 使用測試資料評估模型的表現(平均絕對誤差)
test_MAE = mean_absolute_error(y_test, model.predict(X_test))

# 平均平方誤差(越小越好)
test_MSE = mean_squared_error(y_test, model.predict(X_test))

# 均方根誤差(是 MSE 的平方根,單位與房價一致)
test_RMSE = (test_MSE)**0.5

# 輸出評估結果,保留 4 位小數
print(f'MAE: {test_MAE:.4f}')
print(f'MSE: {test_MSE:.4f}')
print(f'RMSE: {test_RMSE:.4f}')

# 測試一筆資料進行房價預測(共 13 個特徵)
inp = [[0.00632, 18.00, 2.310, 0, 0.5380, 6.5750, 65.20, 4.0900, 1, 296.0, 15.30, 396.90 , 4.98]]

# 使用訓練好的模型進行預測,並印出預測結果
print(f"預測房價: {model.predict(inp)[0]:.4f}")


 

Yiru@Studio - 關於我 - 意如