设为首页|收藏本站|
开启左侧

[问答] 机器学习小例子--预测波士顿房价

[复制链接]
74453 0
0762zs 发表于 2021-12-13 13:01:54 | 只看该作者 打印 上一主题 下一主题
 

一、前言

看我前几篇文章的小伙伴都知道,最近一直在学习机器学习相关内容
学校里也开了这门课,有个很经典的作业就是利用机器学习知识预测波士顿房价
网上也有非常多相关介绍,但是一个个函数及参数我是真的不明白啥意思
索性干脆就自己学完写一个初学者也能很好上手的代码
不过还是需要对读者提些要求:
1、需要简单了解python基础知识
2、会简单使用pycharm或者jupyter notebook
3、知道添加三方头文件的方法
4、简单知道线性回归是干嘛的
第三条不太清楚的可以看我这篇文章
话不多说直接开始
二、简单介绍头文件

from sklearn.datasets import load_boston
from sklearn.model_selection import learning_curve
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import ShuffleSplit
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt1、sklearn头文件

一般python编辑器是不自带这个,需要自己下载
管理员身份运行cmd
pip install sklearn提示安装成功就行
意外

题主执行pip指令是老是报错,以为是网速的问题
换用conda进行
结果还是非法报错
ValueError: check_hostname requires server_hostname
后来才发现是网络代理开着
关上就行
2、其他头文件

numpy和pandas这两个用于分析数据的头文件基本上都是不不分家
matplotlib头文件就是用来绘图的
也用pip基本上就行
pip install numpy
pip install pands
pip install matplotlib如有报错直接百度
有参考我这篇文章使用手动和半自动方法的话一定要注意你python版本号和电脑是多少位的
三、题目理解

1、题目的简单介绍



机器学习小例子--预测波士顿房价 第1张图片
想参考全部的数据可以访问这个网站
简单的数据展示:

机器学习小例子--预测波士顿房价 第2张图片

2、属性标签

共有13个属性标签(feature)和1个预测目标(target)
CRIM     per capita crime rate by town  
ZN       proportion of residential land zoned for lots over 25,000 sq.ft.  
INDUS    proportion of non-retAIl business acres per town  
CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)  
NOX      nitric oxides concentration (parts per 10 million)  
RM       average number of rooms per dwelling  
AGE      proportion of owner-occupied units built prior to 1940  
DIS      weighted distances to five Boston employment centres  
RAD      index of accessibility to radial highways  
TAX      full-value property-tax rate per $10,000  
PTRATIO  pupil-teacher ratio by town  
B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town  
LSTAT    % lower status of the population  
MEDV     Median value of owner-occupied homes in $1000's
代码中我任选三个属性特征(feature)来预测房价(target)
当然理论上13个特征全选预测出来的房价会更准确了
但先把简单的都弄会了再把其他特征都加进去
3、降维比喻

假如我们在宠物店相中了一条,想猜猜他值多少钱,这个时候会找一些因素来判断狗狗是贵还是划算还是便宜,比如我列举了些因素:
颜色:可能黑色和黄色比较贵,杂色便宜
疫苗:打了疫苗会比没打疫苗贵,疫苗分为便宜和贵
听话与否:接受过训练比没接收过可能要贵
性格:活泼的更讨人喜欢
年龄:年龄小的更容易被顾客接受
血统:纯血或者父母都是品种纯净比混血更贵
如果只看颜色的话,大概能预测出一个价位
如果参考颜色和血统,又会得出一个价位
以此类推,如果考虑所有条件,那得出的价位更接近真实价格
这些因素就对应这波士顿房价的13个特征属性(feature)
狗狗的价位也对应着波士顿的房价(target)
四、代码

1、代码及注释

from sklearn.datasets import load_boston
from sklearn.model_selection import learning_curve
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
from sklearn.model_selection import ShuffleSplit
import matplotlib.pyplot as plt


boston = load_boston()                      # 加载boston数据

X = boston.data                             # data为数据中的13个特征数据的所有值
Y = boston.target                           # target为数据中的想要预测的目标数据
# print(X.shape)                              # 训练向量,包括样本数量和特征的数量两个参数
#print(boston.keys())                        # boston的属性。输出结果dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])

df = pd.DataFrame(boston.data,columns=boston.feature_names)        # 以feature_names作为列名,把data填充到矩阵中,得到boston的数据
df['target'] = pd.Series(boston.target)     # 把target内容以列的形式保存在df的target中
print(df.head())                            # 只读取df中前五行数据,默认为五行

features = df[['CRIM','RM','LSTAT']]        # 选取三个特征
print(features.describe())                  # 显示数量统计(count),均值(mean),标准差(std),最小值(min),四分位数(25%,50%,75%),最大值(max)

target = df['target']                       # 取出target的数值

split_num = int(len(features)*0.7)          # 切割数据集,train占0.7,test占0.3

X_train = features[:split_num]              # X_train取前70%部分的数据
Y_train = target[:split_num]                # Y_train取前70%部分的数据


X_test = features[split_num:]               # X_test取后30%部分的数据
Y_test = target[split_num:]                 # Y_test取后30%部分的数据

model = LinearRegression()                  # 使用线性回归
model.fit(X_train,Y_train)                  # 构建模型,调用fit训练
print(model.coef_,model.intercept_)         # 打印系数θ1,θ2,θ3和截距θ0
                                            # 拟合直线f = θ1*x1+θ2*x2+θ3*x3+θ0
                                            # x1,x2,x3分别对应特征'CRIM','RM','LSTAT'
preds = model.predict(X_test)               # 用测试集测试得到预测结果
print(preds)                                # 输出预测值


def mae_value(y_true,y_pred):               # 计算MAE,传递参数分别为真实值和预测值
    n = len(y_true)
    mae = sum(np.abs(y_true - y_pred)) / n
    return mae

def mse_value(y_true,y_pred):               # 计算MSE
    n = len(y_true)
    mse = sum(np.square(y_true - y_pred)) / n
    return mse

mae = mae_value(Y_test.values,preds)        # values返回列表中所有的值
mse = mse_value(Y_test.values,preds)
print("MAE:",mae)
print("MSE:",mse)

def plot_learning_curve(plt,estimator,title,X,Y,ylim = None,cv = None,
                        n_jobs=1,train_sizes=np.linspace(.1,1.0,5)):    # 封装学习曲线函数
                            #estimator为使用的分类器。
                            #X为传入的矩阵(feature)
                            #Y传入的特征属性(target)
                            #ylim定义y轴取值范围
                            #cv默认使用3折交叉验证
                            #n_jobs并行运行的作业数
                            #train_sizes训练样本的相对或绝对的数字
    plt.title(title)                                    # plt.title设置图像标题
    if ylim is not None:
        plt.ylime(*ylim)
    plt.xlabel("Training example")                      # 设置x和y轴的标题
    plt.ylabel("Score")                                 # 设置x和y轴的标题
    train_sizes,train_scores,test_scores = learning_curve(estimator, X, Y, cv = cv, n_jobs = n_jobs,
                                                            train_sizes = train_sizes)
    train_scores_mean = np.mean(train_scores, axis=1)   # 平均值
    train_scores_std = np.std(train_scores, axis=1)     # 标准差
    test_scores_mean = np.mean(test_scores, axis=1)     # 平均值
    test_scores_std = np.std(test_scores, axis=1)       # 标准差
    plt.grid()                                          # 生成网格线
    plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1,
                     color="r")                         # 曲线下面覆盖成红色
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1,
                     color="g")                         # 曲线下面覆盖成绿色
    plt.plot(train_sizes, train_scores_mean, 'o--', color="r", label="Training score")          # 显示红色曲线
    plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation score")    # 显示绿色曲线
    plt.show()                                          # 在pycharm里取消注释
    plt.legend(loc="best")                              # 图例位置放在合适(best)位置
    return plt

cv = ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)     # 交叉验证的参数
plt.figure(figsize=(10,6))                              # 指定figure的高和宽
plot_learning_curve(plt,model,"Learn Curve fore LinearRegression",features,target,ylim=None,cv=cv)
                                                        # 画出学习曲线2、代码缺点

因为着急写出来,所以只封装了MAE、MSE与学习曲线函数
所以不用大家太多的跳转着读代码
基本上从上往下读就ok
等有机会在更新下封装起来的全部代码
五、运行结果

直接上图吧

机器学习小例子--预测波士顿房价 第3张图片
虚线:针对训练数据集拟合的准确性
实线:针对交叉验证数据集拟合的准确性
如果依然有不懂的同学可以直接评论或私我
完事!!!


上一篇:全美大学挂科率Top 100出炉!宾大第二,哈耶普斯前五都没进 ...
下一篇:刘道玉:为什么清华不是世界一流大学
@



1.西兔生活网 CTLIVES 内容全部来自网络;
2.版权归原网站或原作者所有;
3.内容与本站立场无关;
4.若涉及侵权或有疑义,请点击“举报”按钮,其他联系方式或无法及时处理。
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

排行榜
活跃网友
返回顶部快速回复上一主题下一主题返回列表APP下载手机访问
Copyright © 2016-2028 CTLIVES.COM All Rights Reserved.  西兔生活网  小黑屋| GMT+8, 2024-5-3 00:23