机器学习线性回归——房价预测问题(California housing)

一个地区的房价与该地区的地理位置、人口数、居民收入等诸多特征有着密切的关系。房价预测问题是要根据给定小区的特征预测该小区房价的中位数,这是一个经典的回归问题。在sklearn工具库中集成了房价预测问题的数据california_housing,可以直接用。california_housing数据集中的每条数据都包含9个变量:人均收入(MedInc)、房龄(HouseAge)、房间数(AveRooms)、卧室数(AveBedrooms)、小区人口数(Population)、房屋居住人数(AveOccup)、小区经度(Longitude)、小区纬度(Latitude)和房价中位数(Median_house_value)。其中,房价中位数是标签,其余的8个变量均为特征。
california_housing数据采样:

序号 MedInc HouseAge AveRooms AveBedrooms Population AveOccup Latitude Longitude Median_house_value
1 4.5625 46 4.8 1.02 1872 833 37.97 -122.59 275200
2 10.7326 11 8.5 1.1 1947 641 37.30 -122.06 500001
3 2.3159 13 4.1 1.04 3094 1091 33.16 -117.20 91600
4 1.6352 46 5.4 1.1 871 347 39.51 -121.56 53100
5 5.8491 36 6.6 1.04 1911 631 33.79 -118.09 247300

显然,可以将房价预测问题看作一个线性回归问题,并尝试用线性回归算法求解。建立房价预测的模型。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler

def fit(X, y):  # 求正规方程
    w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)  # w*=(XT⦁X)-1⦁X⦁y
    return w

def predict(X,y):  # 预测X对应的Y值
    w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
    return X.dot(w)  # Y_pred = X ⦁ w*

def process_features(X):
    scaler = StandardScaler()
    X = scaler.fit_transform(X)#对特征进行标准化
    m,n=X.shape
    X = np.c_[np.ones((m,1)),X]
    return X

def mean_squared_error(y_true, y_pred):  # 求均方误差
    return np.average((y_true - y_pred) ** 2, axis=0)

def r2_score(y_true, y_pred):  # 求决定系数
    numerator = (y_true - y_pred) ** 2
    denominator = (y_true - np.average(y_true, axis=0)) ** 2
    return 1 - numerator.sum(axis=0) / denominator.sum(axis=0)

housing = fetch_california_housing()#导入数据集
X = housing.data#存储特征矩阵
y = housing.target.reshape(-1,1)#存储标签
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 0)#选取20%的数据作为测试数据,其余80%作为训练数据

#处理特征
X_train = process_features(X_train)
X_test = process_features(X_test)

fit(X_train,y_train)#训练模型
y_pred = predict(X_test,y_test)#对模型进行测试
mse = mean_squared_error(y_test,y_pred)
r2 = r2_score(y_test,y_pred)
print("mse={}and r2={}".format(mse,r2))

结果:

mse=[0.52451928]and r2=[0.59774738]

从决定系数大雨50%来看,模型的拟合效果比较理想。

你可能感兴趣的:(机器学习)