sklearn-随机森林与线性回归

宏观概念:随机森林依然和上面一样,属于对预估器,生成模型这一模块的调整

整体框架:1.数据清洗并且获取数据(pandas清洗掉异常值,空值等)2.特征工程:让数据转换为计算机可以识别的数据(字典,文本,音频的转换),数据的标准化,归一化(无量纲化,给予,每个数据权重),去掉相关值不大或者无用数据(低方差过滤和PCA分析法)3.划分数据集与筛选目标值与特征值 4生成预估器,让预估器根据算法与数据训练生成模型 5.模型的保存与评估.

 1.集成学习与随机森林

1.1集成学习的基本思想

集成学习的基本思想将多个分类器组合,从而实现一个预测效果更好的集成分类器,例如一个选择题让全班同学一起做,如果答案选A的最多那么默认答案为A(全班同学就是一个强分类器),如果一个填空题就取所有人的平均值。

官方流程: 1.每次有放回地从训练集中取出 n 个训练样本,组成新的训练集2.利用新的训练集,训练得到M个子模型3.对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别

 集成算法大致可以分为:Bagging,Boosting 和 Stacking 三大类型。(不同的数据集组合,不同的预估器组合,不同的模型组合)

1.2随机森林

1.2.1随机森林的介绍与算法原理

随机森林属于集成学习,通过构建一个包含多个决策树(通常称为基学习器或弱学习器)的森林,每棵树都在不同的数据子集和特征子集上进行训练,最终通过投票或平均预测结果来产生更准确和稳健的预测。(要经过测试集)

算法原理:

注意:不同的数据子集和特征子集合

随机: 特征随机,训练集随机

样本:对于一个总体训练集T,T中共有N个样本,每次有放回地随机选择n个样本。用这n个样本来训练一个决策树。

特征:假设训练集的特征个数为d,每次仅选择k(k<d)个来构建决策树。

森林: 多个决策树分类器构成的分类器, 因为随机,所以可以生成多个决策树

 1.2.2API

 class sklearn.ensemble.RandomForestClassifier

参数:
n_estimators    int, default=100
森林中树木的数量。(决策树个数)

criterion    {“gini”, “entropy”}, default=”gini” 决策树属性划分算法选择
    当criterion取值为“gini”时采用 基尼不纯度(Gini impurity)算法构造决策树,
    当criterion取值为 “entropy” 时采用信息增益( information gain)算法构造决策树.
ax_depth    int, default=None 树的最大深度。 

 1.3示例分析

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import  export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

# 1、获取数据
titanic = pd.read_csv("src/titanic/titanic.csv")
titanic.head()
# 筛选特征值和目标值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]

#2、数据处理
# 1)缺失值处理
x["age"].fillna(x["age"].mean(), inplace=True)
# 2) 转换成字典
x = x.to_dict(orient="records")
# 3)、数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4)、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

'''
#3 预估: 不加网格搜索与交叉验证的代码
estimator = RandomForestClassifier(n_estimators=120, max_depth=5)
# 训练
estimator.fit(x_train, y_train)
'''

#3 预估: 加网格搜索与交叉验证的代码
estimator = RandomForestClassifier()
# 参数准备  n_estimators树的数量, max_depth树的最大深度
param_dict = {"n_estimators": [120,200,300,500,800,1200], "max_depth": [5,8,15,25,30]}
# 加入网格搜索与交叉验证, cv=3表示3次交叉验证
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 训练
estimator.fit(x_train, y_train)


# 5)模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)

# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

'''
加网格搜索与交叉验证的代码
print("最佳参数:\n", estimator.best_params_)
print("最佳结果:\n", estimator.best_score_)
print("最佳估计器:\n", estimator.best_estimator_)
print("交叉验证结果:\n", estimator.cv_results_)
'''

这段代码不是我写的,写的特别的好,多敲一遍一遍的敲

2.线性回归 

提一个小的知识点:分类的目标变量是标称型数据,回归是对连续型的数据做出预测。(分类问题中的猫,狗不同的分类他们没有数据意义的距离和顺序,属于标注型数据,回归问题中的温度呀等等属于连续型数据)

2.1回归与线性回归

 1个包子是2元 3个包子是6元 预测5个包子多少钱?

列出方程: y=wx+b  带入:2=w*1+b   6=w*3+b   轻易求得 w=2 b=0

所以得到模型: y=2*x+0      对5个包子的预测结果就是  y=2*5+0=10

 线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。回归的目的是预测数值型的目标值y(有自变量预测出因变量就是回归) ,线性回归是机器学习中一种有监督学习的算法,回归问题主要关注的是因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系.(就是模型)

2.2机器学习中的线性回归

根据这几个点,我们要预测出这个模型,可以看到这几个点不在一条直线上(为什么是直线因为这是一元一次方程组),所有我们要尽可能的找到最接近于客观真理的直线(完美的包含这些点)

2.3损失函数 

损失函数的概念并非我们空穴来风的专有名词,而是为了机器精准的找到那条理想直线

 

 假设我们拟合直线是这三条,那条直线更合适?肉眼可以看到中间最合适,但是机器不行,所以引入数学计算来确定我们的直线是最适合的拟合直线

 

 直线合适代表每个点映射到直线上损失值最小,但是有的点近,有的点远,所有我们让平均损失值最小,那么直线最合适

可以看到图中一个点的误差y-y^也就是wx-y^  所以所有误差为loss=n(wx-y^)

这里有个问题:如果预测值在真实值的上面,那么会出现负数,负正相加,所以所有损失平方 

 所有我们得到损失函数为均方差(平均误差的平方)

 

 这个时候求导,倒数为0的点就是w最合适的点,函数收敛的点

 这里默认b=0,b不为0也是常数项求导消掉了

2.4 多参数回归

实际情况下,往往影响结果y的因素不止1个,这时x就从一个变成了n个,x_1,x_2,x_3...x_n 上面的思路是对的,但是求解的公式就不再适用了

2.4.1二维数据求解 

 上面一维数据一元二次方程组,二维数据二元二次方程组,应该怎么求解

 

 思路是一样的,找到一条理想直线,然所有点在这条直线的损失值最小(分成x,y两个方向的损失值综合最小)

解决思路:一个方向一个方向找,方向由x,y两个分量确定,那我先切一个x平面,得到蓝色的区域,在蓝色区域内找到y最小的方向也就是w1,再在y方向上切一刀,绿色区域,在绿色平面上找到 x最小的方向也就是w2,最终的到w1,w2

即随机在曲面上选点,重复单参数线性回归的步骤,得到参数

2.4.2多参数回归 

 多参数了,多个因素综合求解,思路是相同的,但是具体算法还是要推一遍

数学角度推演:

 

链式求导法则: 

 

 从某种角度还是要感叹前人的智慧,这里有了W的算法就可以调用API让计算机来算W了

2.4.3API的调用

sklearn.linear_model.LinearRegression()
功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法

参数:
fit_intercept    bool, default=True
    是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。
属性:     
coef_ 回归后的权重系数
intercept_ 偏置

print("权重系数为:\n", estimator.coef_)  #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)

 2.5示例分析

from sklearn.linear_model import LinearRegression
import numpy as np
data=np.array([[0,14,8,0,5,-2,9,-3,399],
               [-4,10,6,4,-14,-2,-14,8,-144],
               [-1,-6,5,-12,3,-3,2,-2,30],
               [5,-2,3,10,5,11,4,-8,126],
               [-15,-15,-8,-15,7,-4,-12,2,-395],
               [11,-10,-2,4,3,-9,-6,7,-87],
               [-14,0,4,-3,5,10,13,7,422],
               [-3,-7,-2,-8,0,-6,-5,-9,-309]])
x=data[:,0:8]
y=data[:,8:]
estimator=LinearRegression(fit_intercept=False)
estimator.fit(x,y)
print("权重系数为:\n", estimator.coef_)  #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)
x_new=[[11,14,8,10,5,10,8,1]]
y_predict=estimator.predict(x)
print("预测结果:\n",y_predict)
print(-3*0.4243965-7*7.32281732-2*15.05217218-8*3.5996297+0*12.05805264-6*1.76972959-5*17.0276393-9*11.31212591)

有志者事竟成,破釜沉舟百二秦关终属楚,苦心人天不负,卧薪尝胆三千越甲可吞吴。多练少说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值