使用线性回归预测波士顿房价

数据文件【boston_house.csv】中存放了数百条波士顿房价信息。每条信息包括14个字段:

1、前13个字段作为特征字段

(1)CRIM:城镇人均犯罪率。

(2)ZN:住宅用地超过25000平方英尺的比例。

(3)INDUS:城镇非零售商用土地的比例。

(4) CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。

(5) NOX:一氧化氮浓度。

(6)RM:住宅平均房间数。

(7) AGE:1940 年之前建成的自用房屋比例。

(8) DIS:到波士顿五个中心区域的加权距离。

(9)RAD:辐射性公路的接近指数。

(10) TAX:每 10000 美元的全值财产税率。

(11)PTRATIO:城镇学生数:教师数的比例。

(12)B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。

(13) LSTAT:人口中地位低下者的比例。

(14)第14个字段(MEDV,即平均房价)作为结果字段,以千美元计。

2、使用sklearn的线性回归模型,选择3~4个字段进行回归分析。

装载并查看数据信息

下面的代码从【boston_house.csv】中装载数据,并且显示了部分统计数据:

boston_house.csv
链接:https://pan.baidu.com/s/1Q31NjPsKRArQrTne9jnxtA?pwd=6688 
提取码:6688
import numpy as np
import pandas as pd

data = np.loadtxt('boston_house.csv', delimiter=',',skiprows=1)
print("装载原始数据维度:", data.shape)
features = data[:, :-1]
prices = data[:, -1]
feature_names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT']
# 打印前5条数据
print(feature_names)
np.set_printoptions(formatter={'float': '{: 0.2f}'.format})
print(data[:5, :])

# 查看房价统计数据
print("房价数据统计:")
print("最低:%.2f, 最高:%.2f, 平均:%.2f, 中位数:%.2f, 标准差:%.2f" % 
     (np.min(prices), np.max(prices), np.mean(prices), np.median(prices) ,np.std(prices)))

查看各个特征与价格之间的对应关系趋势

下面的代码分别作出了每个特征与价格之间的对应关系图(散点图),请从中选出3~4个有较好线性关系的特征,作为下一步线性回归模型的特征横坐标为特征,纵坐标为价格

%matplotlib inline
import matplotlib.pyplot as plt

row_num = 3
col_num = 5
plt.figure(figsize=(10,7))
#  绘制图表
for i in range(row_num):
    for j in range(col_num):
        index = i*col_num+j+1
        if (index > len(feature_names)):
            break
        plt.subplot(row_num, col_num, index)
        plt.scatter(features[:, index-1], prices)
        plt.title(feature_names[index-1] + "-" + "prices")

plt.subplots_adjust(wspace = 0.3, hspace = 0.5)
plt.show()

设置训练集和数据集

1、从原有data集合中,选择若干个特征列(建议3~4个特征列)以及最后一列数据,构成新的数据集

2、将新数据集按照8:2拆分成训练数据集和测试数据集

3、对数据集中的特征(包括训练集和测试集)进行归一化处理

import numpy as np
### TODO:向下列column_idx集合中,添加被选中的特征列的下标索引。最后一列(-1)必须选中
column_idx = [5, 10, 12, -1]    # 例如:column_idx = [1,2,3,-1]

data = data[:, column_idx]
np.random.seed(100)    
np.random.shuffle(data)    # 打乱行顺序
train_num = (int)(len(data) * 0.8)
train_features = data[:train_num, :-1]    # 训练数据集
train_prices = data[:train_num, -1]
test_features = data[train_num:, :-1]    # 测试数据集
test_prices = data[train_num:, -1]

# 使用StandardScaler进行归一化处理:x' = (x-mean(x))/std(x)
from sklearn.preprocessing import StandardScaler
normalizer = StandardScaler()
train_features = normalizer.fit_transform(train_features)
test_features = normalizer.transform(test_features)  # 测试数据特征,也需要归一化处理

print("训练数据集特征维度:", train_features.shape)
print("测试数据集特征维度:", test_features.shape)

使用LinearRegression训练模型,并且针对测试数据计算R2

import numpy as np
from sklearn.linear_model import LinearRegression
model = None
r2 = None
### TODO:创建LinearRegression对象并存放在model变量中
model = LinearRegression()
hypothesis = model.fit(train_features,train_prices)
r2 = model.score(test_features,test_prices)
print(r2)

你可能感兴趣的:(机器学习,线性回归,python,机器学习)