Skr-Eric的机器学习课堂(三)-- 多项式回归和决策树

多项式回归

x->y

x1->y1

x2->y2

...

xm->ym

----------

一元多项式回归

y=w0 + w1 x + w2 x^2 + w3 x^3 + ... + wd x^d

将高次项看做对一次项特征的扩展

y=w0 + w1 x1+  w2 x2   + w2 x3 + ... + wd xd

多元线性回归

 x                                x1,x2,x3,...,xd                   w0,w1,...,wd

-->多项式特征扩展器---------------->线性回归器------------>

                                   x1=x

                                   x2=x^2

                                   x3=x^3

                                   ...

                                   xd=x^d

     \___________________________________________/

                                       |

                                    管线

欠拟合:模型对训练数据和测试数据都不能得出足够高的匹配精度。增加特征值,提高模型的复杂度,降低正则强度。

过拟合:模型对训练数据可以得到相对高的匹配精度,但对训练集以外的测试数据却表现较差。减少特征值,降低模型的复杂度,增加正则强度。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
# 采集数据
x, y = [], []
with open('../../data/single.txt', 'r') as f:
    for line in f.readlines():
        data = [float(substr) for substr
                in line.split(',')]
        x.append(data[:-1])
        y.append(data[-1])
x = np.array(x)
y = np.array(y)
# 创建模型(管线)
model = pl.make_pipeline(
    sp.PolynomialFeatures(10),  # 多项式特征扩展器
    lm.LinearRegression())      # 线性回归器
# 训练模型
model.fit(x, y)
# 根据输入预测输出
pred_y = model.predict(x)
# R2得分,将[0,∞)区间的误差映射到[1,0)区间的分值
print(sm.r2_score(y, pred_y))
test_x = np.linspace(x.min(), x.max(),
                     1000)[:, np.newaxis]
pred_test_y = model.predict(test_x)
mp.figure('Polynomial Regression',
          facecolor='lightgray')
mp.title('Polynomial Regression', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.scatter(x, y, c='dodgerblue', alpha=0.75,
           s=60, label='Sample')
mp.plot(test_x, pred_test_y,
        c='orangered', label='Regression')
mp.legend()
mp.show()

 

决策树

1.基本算法原理

核心思想:相似的输入必会产生相似的输出。

年龄:1-青年,2-中年,3-老年

学历:1-本科,2-硕士,3-博士

经历:1-出道,2-一般,3-老手,4-骨灰

性别:1-男性,2-女性

年龄    学历    经历    性别  ->  薪资

1         1        1          1            6000     低

2         1        3          1            10000   中

3         3        4          1            50000   高

...

1         3        2          2      ->  ?

        年龄=1                       年龄=2                     年龄=3

       /      |      \                    /     |     \                      /     |     \

学历1 学历2 学历3  学历1 学历2 学历3  学历1 学历2 学历3

...

首先从训练样本矩阵中选择第一个特征进行子表划分,使每个子表中该特征的值全部相同,然后再在每个子表中选择下一个特征按照同样的规则继续划分更小的子表,不断重复直到所有的特征全部使用完为止,此时便得到叶级子表,其中所有样本的特征值全部相同。对于待预测样本,根据其每一个特征的值,选择对应的子表,逐一匹配,直到找到与之完全匹配的叶级子表,用该子表中样本的输出,通过平均(回归)或者投票(分类)为待预测样本提供输出。

2.工程优化

不必用尽所有的特征,叶级子表中允许混杂不同的特征值,以此降低决策树的层数,在精度牺牲可接受的前提下,提高模型的性能。通常情况下,可以优先选择使信息熵减少量最大的特征作为划分子表的依据。

3.集合算法

模型1->8000    低

模型2->10000  高

模型3->9000    中

...

根据多个不同模型给出的预测结果,利用平均(回归)或者投票(分类)的方法,得出最终预测结果。

1)自助聚合:每次从总样本矩阵中以有放回抽样的方式随机抽取部分样本构建决策树,这样形成多棵包含不同训练样本的决策树,以削弱某些强势样本对模型预测结果的影响,提高模型的泛化特性。

2)随机森林:在自助聚合的基础上,每次构建决策树模型时,不仅随机选择部分样本,而且还随机选择部分特征,这样的集合算法,不仅规避了强势样本对预测结果的影响,而且也削弱了强势特征的影响,是模型的预测能力更加泛化。

3)正向激励:首先为样本矩阵中的样本随机分配初始权重,由此构建一棵带有权重的决策树,在由该决策树提供预测输出时,通过加权平均或者加权投票的方式产生预测值。将训练样本代入模型,预测其输出,对那些预测值与实际值不同的样本,提高其权重,由此形成第二棵决策树。重复以上过程,构建出不同权重的若干棵决策树。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sklearn.datasets as sd
import sklearn.utils as su
import sklearn.tree as st
import sklearn.ensemble as se
import sklearn.metrics as sm
# 加载波士顿地区房价数据集
boston = sd.load_boston()
# 打乱原始数据集的输入和输出
x, y, = su.shuffle(boston.data, boston.target,
                   random_state=7)
# 划分训练集和测试集
train_size = int(len(x) * 0.8)
train_x, test_x, train_y, test_y = \
    x[:train_size], x[train_size:], \
    y[:train_size], y[train_size:]
# 创建决策树回归器模型
model = st.DecisionTreeRegressor(max_depth=4)
# 训练模型
model.fit(train_x, train_y)
# 测试模型
pred_test_y = model.predict(test_x)
print(sm.r2_score(test_y, pred_test_y))
# 创建基于决策树的正向激励回归器模型
model = se.AdaBoostRegressor(
    st.DecisionTreeRegressor(max_depth=4),
    n_estimators=400, random_state=7)
# 训练模型
model.fit(train_x, train_y)
# 测试模型
pred_test_y = model.predict(test_x)
print(sm.r2_score(test_y, pred_test_y))

4.特征重要性

作为决策树模型训练过程的副产品,根据每个特征划分子表前后的信息熵减少量就标志了该特征的重要程度,此即为该特征的重要性指标。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sklearn.datasets as sd
import sklearn.utils as su
import sklearn.tree as st
import sklearn.ensemble as se
import matplotlib.pyplot as mp
# 加载波士顿地区房价数据集
boston = sd.load_boston()
fn = boston.feature_names
# 打乱原始数据集的输入和输出
x, y, = su.shuffle(boston.data, boston.target,
                   random_state=7)
# 划分训练集和测试集
train_size = int(len(x) * 0.8)
train_x, test_x, train_y, test_y = \
    x[:train_size], x[train_size:], \
    y[:train_size], y[train_size:]
# 创建基于决策树的正向激励回归器模型
model = se.AdaBoostRegressor(
    st.DecisionTreeRegressor(max_depth=4),
    n_estimators=400, random_state=7)
# 训练模型
model.fit(train_x, train_y)
# 获取特征重要性
fi = model.feature_importances_
mp.figure('Feature Importance',
          facecolor='lightgray')
mp.title('Feature Importance', fontsize=20)
mp.xlabel('Feature', fontsize=14)
mp.ylabel('Importance', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(axis='y', linestyle=':')
sorted_indices = fi.argsort()[::-1]
pos = np.arange(sorted_indices.size)
mp.bar(pos, fi[sorted_indices],
       facecolor='lightcoral', edgecolor='indianred')
mp.xticks(pos, fn[sorted_indices], rotation=30)
mp.show()

 

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值