一、决策树算法基础
1、决策树算法:
NOTE:
决策树是一个贪心算法,每次选择划分数据的划分节点的时候,都是选择让损失函数变的更小的这个特征属性作为划
分节点,只考虑局部最优没有考虑全局最优。
在分类的时候,损失函数可以理解为信息熵;在回归的时候,损失函数可以理解为MSE。
只有基于决策树模型才能传入多个标签,其他的模型需要用多标签多类别的API去做,但实际工作中通常
一个一个标签的去做。
2、决策树算法知识脉络:
-1. 决策树算法是什么?你怎么理解决策树算法的?
-2. 决策树算法的执行过程?你觉得为什么可以基于决策树做特征选择?
-3. 决策树算法的优缺点?如何解决这个缺点?
-4. 回归决策树的构建的思想?(以往MSE最小化的方向进行数据的划分)
-5. 决策时过拟合欠拟合的解决方案?
-6. 简述一下ID3的优缺点,C4.5对于ID3解决了那些问题、CART对于C4.5解决了什么问题?
1. 决策树算法是什么?你怎么理解决策树算法的?
1.1 决策树是一种贪心算法(局部最优),根据已知样本分布的概率来来进行划分数据的一种有监督学习方法,决策树是一种
解释性强、直观、准确度高的一种用于概率分析的树状结构的模型。
2. 决策树算法的执行过程?你觉得为什么可以基于决策树做特征选择?
2.1 决策树算法的执行过程:
决策树算法生成思想:特征选择、决策树生成、剪枝(前项剪枝、后项剪枝)。
① 特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多
不同量化评估标准标准,从而衍生出不同的决策树算法。
② 决策树生成: 根据选择的特征评估标准(ID3、C4.5、CART评估是什么?),从上至下递归地生成子节点,直到数据
集不可分或达到限制条件则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。
③ 剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。
2.2 为什么决策树可以进行数据划分?
决策树算法在进行根节点特征选择的时候是让数据尽可能的存,即条件熵最小,所以该跟节点是对数据局决策能力最大的
特征,循环该步骤,则决策树的特征划分从上到下特征重要性依次减小。
3. 决策树算法的优缺点?如何解决这个缺点?
3.1 优点:
① 决策树是一种解释能力极强、直观、逻辑性强的树状算法
② 可以同时处理类别型与数值型的数据
⑤ 在合理的剪枝情况下,模型的准确度很高。
③ 可以处理线性数据与非线性数据的分类、回归问题。
④ 模型训练好以后,模型运行的速度非常快。
⑤ 便于集成学习。
缺点:
① 决策树模型对噪声数据敏感,容易过拟合(可以通过剪枝缓解)
② 在处理特征关联型数据时表现效果不明显。
③ 决策树是一种贪心算法,只考虑局部最优,没有考虑全局最优
4. 回归决策树的构建的思想?(以往MSE最小化的方向进行数据的划分)
回归决策树是以训练数据MSE(回归决策树算法中MSE即方差)最小的特征作为划分节点,以各个叶节点的均值作为预测值。如
果特征是连续的情况,将连续的Y值从大到小进行排序,用Y分位点作为分割的方法。
5. 决策时过拟合欠拟合的解决方案?
欠拟合:
① 增加树的深度
② 利用集成学习Boosting的思想(Adaboost、GBDT、XGboost)
过拟合:
① 剪枝(减少树的深度、节点分割字节点的最小数据量 ....)
② 利用集成学习Bagging的思想(Bagging、RF ....)
6. 简述一下ID3的优缺点,C4.5对于ID3解决了那些问题、CART对于C4.5解决了什么问题?
6.1 ID3算法的优缺点:
pass
6.2 C4.5对于ID3解决了那些问题
针对缺点1:ID3数据划分比较倾向于特征的分类比较多的特征属性
解决方案:C4.5用信息增益率代替信息增益。
针对缺点2:ID3决策树不能处理连续的特征
解决方案:寻找 point_split点进行分割离散化,用这些离散的分割点来进行数据划分。
针对缺点3:ID3算法不支持剪枝,因此容易过拟合
解决方案:C4.5 算法支持剪枝,缓解过拟合。
6.3 CART对于C4.5解决了什么问题?
针对问题1:ID3算法、C4.5算法计算复杂、多叉树问题
解决方案:CART是二叉分类回归树,它用 gini增益 来作为划分评估,减少了计算量。
针对问题2:ID3算法、C4.5算法无法解决回归问题?
解决方案:CART 以MSE作为划分评估,以叶节点的均值作为预测值。
1、信息熵
(1)信息熵的计算方式
(2)数据混乱程度与信息熵的关系
(3)条件熵
- 条件熵的计算方式
- 条件熵的性质
2、决策树
(1)什么是决策树
思想:决策树是一种基于历史数据的概率关系进行数据划分的一种算法。在对数据进行划分的时候,希望将数据可能的划分的足够
的“纯”,也就是最好是划分之后的数据集中只有一个类别的数据
1、决策树的概念:
决策树是一种非常常用的有监督的分类(CART决策树也可以做回归)算法,决策树(Decision Tree)是在已知各种情况发生概
率的基础上,通过构建决策树来进行分析的一种方式,是一种直观应用概率分析的一种图解法;
2、决策树的预测过程:
是从根节点开始,测试待分类项中对应的特征属性,并按照其 值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为
决策结果。
3、 决策树类别:
分类树和回归树,前者用于分类标签值,后者用于预测连续值, 常用算法有ID3(多叉分类)、C4.5(多叉分类)、CART(二
叉分类回归树)等
4、决策树的特点:
• 决策树算法是一种“贪心”算法策略,只考虑在当前数据特征情况下的最好分割方式,不能进行回溯操作。
• 对于整体的数据集而言,按照所有的特征属性进行划分操作,对所有划分操 作的结果集的“纯度”进行比较,选择“纯度”越高的
特征属性作为当前需 要分割的数据集进行分割操作,持续迭代,直到得到最终结果。决策树是通 过“纯度”来选择分割特
征属性点的。
(2)决策树的构建方案
1、信息熵
NOTE: 决策树会将决策能力强的特征属性放到决策树的根节点。
信息熵越高 --> 数据集中没有突出的类别存在;
信息熵越低 --> 数据集中有某一个类别出现的可能性非常的大;
条件熵 --> 多个数据集合的信息熵的加权均值,权重为每个数据集集合的数据占比。
2、决策树划分策略
决策树划分策略 --> 选择让数据集更“纯”的特征属性进行划分 --> 也就是让划分之后的数据集的信息熵足够小,越小越好 -->
划分之后的数据是存在多个数据集,所以需要条件熵进行衡量
3、决策树划分过程
选择条件熵最小(信息增益量最大)的特征属性作为划分特征 --> 表示基于这个特征划分之后的数据是足够纯的,也就是每个数
据集中尽可能的只有一个类别的数据 --> 也就是体现了在当前数据集上当前特征属性的决策能力非常强 --> 所以需要将这个特征
放到根节点 --> 基于决策树算法来讲,可以认为越靠近根节点的判断属性,决策能力越强 --> 决策树算法中最终可以通过属
性feature_importances_
(3)决策树特征属性类型对决策树构建的影响
(4)决策树量化纯度的方式:Gini系数、熵(Entropy)、 错误率
- 对于 ID3 算法(离散特征 多叉树分类算法) ------- 信息增益
- C4.5算法(离散、连续特征 多叉树分类算法) ------- 信息增益率
- CART算法(离散、连续特征 二叉树分类回归算法) ---------- gini增益率
- CART回归决策树的纯度划分标准
注意:以上的纯度划分标准是针对于分类决策树,回归决策树的纯度划分标准是 MSE最小(训练集子节点MSE最小)。
(5)决策树算法的停止条件
• 决策树构建的过程是一个递归的过程,所以必须给定停止条件, 否则过程将不会进行停止,一般情况有两种停止条件:
• 当每个子节点只有一种类型的时候停止构建
• 当前节点中样本数小于某个阈值,同时迭代次数达到给定值时,停止构建过程, 此时使用max(p(i))作为节点的对应类型
• NOTE:方式一可能会使树的节点过多,导致过拟合(Overfiting) 等问题;比较常用的方式是使用方式二作为停止条件。
(6)决策树算法效果评估
- 分类决策树
分类决策树评估方式:与传统的分类的评估方式相同。
- 回归决策树
回归决策树评估方式:与传统的回归的评估方式相同。
(7)决策树算法LOSS函数
决策树LOSS函数:决策树是一种贪婪算法,他只考虑当前情况的条件熵最小特征划分。
(8) 决策树预测策略
1、分类树:分类树的 叶子节点的预测结果 是根据当前叶子节点训练数据的目标属性的 多票表决的方式决定
2、回归树:回归树特征属性划分的标准是 MSE(决策树中MSE相当于训练数据的方差)最小,预测结果为 当前训练数据叶子节点的 均值。
(9)决策树过拟合欠拟合的解决方案
决策树:
过拟合 --> 一般是由于决策树深度太深导致的,也就是决策树模型太复杂了。
解决方案:
-1. 限制决策树的深度: 剪枝
-2. 利用随机森林集成学习解决过拟合
欠拟合 --> 一般是由于决策树的深度太浅导致的
解决方案:
-1. 加深决策树的深度,也就是不做太严格的剪枝操作
-2. 利用GBDT、AdaBoost集成学习解决欠拟合
(10)决策树例题
三、决策树主要算法
• 建立决策树的主要是以下三种算法
• ID3
• C4.5
• CART(Classification And Regression Tree)
1、决策树模型的优缺点:
优点:
① 模型易构建,简单直观,具有很强的解释性,模型可以可视化
② 应用范围广,可用于分类和回归,而且非常容易做多类别的分类
③ 能够处理数值型和连续的样本特征(CART算法)
④ 在给定适当的剪枝技巧下,决策树模型泛化能力较强,异常样本不敏感。
缺点:
① 没有合理的剪枝约束下容易过拟合。
② 决策树是基于启发式的贪心算法建立的,这种算法不能保证建立全局最优的决策树。Random Forest 引入随机能缓解
这个问题
③ 忽略数据集中属性的相互关联。
④ 对缺省数据处理较差。
⑤ 需要将数据全部加载内存,适合小规模数据处理。
1、ID3算法
(1)ID3算法基础
1、ID3算法(离散特征 多叉树分类算法) ------- 信息增益为纯度的划分规则
• 1. ID3算法只支持离散的特征属性,不支持连续的特征属性
• 2. ID3算法构建的是多叉树
2、ID3算法:由于ID3算法使用信息增益最大的特征作为数据的划分标准,所以ID3算法比较倾向于特征值类别比较多的特征(特
征值类别较多的特征划分 多叉树条件熵比较低)
(2)ID3算法的优缺点
1、ID3算法的优缺点
优点:
① 模型易构建,简单直观,具有很强的解释性
缺点:
① 计算依赖于特征取值数目较多的特征,而属性值最多的属性并不一定最优
② 只能处理离散特征值的分类问题,不能做回归预测
③ 只适合小规模数据集,需要将数据放到内存中
④ 抗噪性差(ID3算法不支持剪枝)
2、C4.5算法
(1)C4.5算法基础
1、C4.5算法(离散、连续特征 多叉树分类算法) ------- 信息增益率为纯度的划分规则
• 1. C4.5算法支持离散、连续的特征属性
• 2. C4.5算法构建的是多叉树
• 3. C4.5算法用信息增益率作为纯度标准,缓解了ID3算法倾向于特征属性类别较多的特征划分问题。
2、C4.5算法:
① 在树的构造过程中会进行剪枝操作进行优化
② 能够自动完成对连续属性的离散化 处理
③ C4.5构建的是多分支的决策树
(2)C4.5算法的优缺点
• 优点:
• 模型易构建,简单直观,具有很强的解释性
• 准确率较高(它支持剪枝,抗燥性好)
• 缺点:
• 对数据集需要进行多次顺序扫描和排序,所以效率较低
• 只适合小规模数据集,需要将数据放到内存中
3、CART算法 ---- 基尼系数(分类回归树)
sklearn库中只支持CART算法。
(1)CART算法基础
1、CART算法(离散连续特征 二叉分类回归树) ---- GINI增益率 划分
1.1 CART算法使用GINI增益率作为分割属性选择的标准,选择GINI增益率最大的作为当前数据集的分割属性;
1.2 可用于分类和回归两类问题
1.3 CART构建 是二叉树。
(2)CART算法优缺点
1、CART算法优缺点:
优点:
① 在面对诸如存在缺失值、变量数多等问题时CART 显得非常稳健
② 非常灵活,允许有部分错分成本,还可指定先验概率分布,可使用自动剪枝来得到归纳性更强的树。
② 决策树模型的基本优点。
缺点:
①
4、ID3、C4.5、CART算法总结
1、ID3、C4.5、CART算法的区别:
① CART算法构建的一定是二叉树,ID3和C4.5构建的不一定是二叉树。(主要区别)
② ID3算法:离散特征 多叉树分类算法,以信息增益为纯度的划分规则
C4.5算法:离散、连续特征 多叉树分类算法,以信息增益率为纯度的划分规则,支持剪枝
CART算法:离散、连续特征 二叉树分类回归算法,以GINI增益率为纯度的划分规则,支持剪枝
③ 当属性值取值比较多的时候,最好考虑C4.5、CART算法,ID3得出的效果会比较差,CART算法是三种算法中最常用的一种决
策树构建算法(sklearn中仅支持CART)
2、ID3、C4.5、CART算法的相同点:
① ID3、C4.5和CART算法均只适合在小规模数据集上使用(数据集必须可以完全加载 到内存中)
② ID3、C4.5和CART算法都是单变量决策树
四、回归树 VS 分类树
1、回归数与分类树的纯度划分策略
2、回归数与分类树的预测结果策略
3、回归树的预测结果 ---- 分段函数
五、决策树优化策略
1、决策树优化策略的原因:决策树在没有合理剪枝约束下,是极其容易造成过拟合。
2、决策树优化的两个策略:
• 剪枝优化
• 决策树过渡拟合一般情况是由于节点太多导致的,剪枝优化对决策树的正确率影响 是比较大的,也是最常用的一种优
化方式。
• Random Forest
• 利用训练数据随机产生多个决策树,形成一个森林。然后使用这个森林对数据进行 预测,选取最多结果作为预测结果。
1、决策树的剪枝
(1)前向剪枝 ----- sklearn 参数剪枝是前向剪枝
• 前置剪枝:
在构建决策树的过程中,提前停止。结果是决策树一般比较小,实践证明 这种策略无法得到比较好的结果。
(2)后向剪枝
• 后置剪枝:在决策树构建好后,然后再开始裁剪,一般使用两种方式:
1)用单一叶子 节点代替整个子树,叶节点的分类采用子树中最主要的分类;
2)将一个子树完全替代 另外一棵子树;后置剪枝的主要问题是计算效率问题,存在一定的浪费情况。
• 后剪枝总体思路(交叉验证):
• 由完全树T0开始,剪枝部分节点得到T1,在此剪枝得到T2.....直到仅剩树根的树Tk
• 在验证数据集上对这k+1个树进行评价,选择最优树Ta(损失函数最小的树)
六、决策树可视化
1、决策树可视化要求的包
2、 决策树可视化的方式
from sklearn import tree
================================ 决策树可视化 ========================================
导包:
from sklearn import tree
import pydotplus
--------------------------------------------------------------------------------------
第一种方式: 输出dot文件,然后使用dot的命令将文件转换为图像的形式
with open('iris.dot', 'w') as writer:
tree.export_graphviz(decision_tree=algo, out_file=writer)
cmd命令下:dot -T文件路径名 -o输出文件路径名
--------------------------------------------------------------------------------------
第二种方式: 直接输出图像或者pdf文件
dot_data = tree.export_graphviz(decision_tree=treeBest, out_file=None,
feature_names=list('abcdefghijklmn'),
rounded=True, filled=True,
special_characters=True
)
'''
decision_tree -------- 决策树的的对象名
out_file -------- 不导出文件,选择 None
feature_names --------- 设定决策树根据某特征属性划分数据的 特征属性名
rounded=True --------- 图形圆角化
filled=True --------- 图像填充颜色
special_characters=True -------- 格式化显示形式(作用不大)
'''
graph = pydotplus.graph_from_dot_data(dot_data) ------ 将dot对象 dot_data 生成图形对象
graph.write_png("iris1.png") ------------ 将图形对象写出
graph.write_pdf("iris1.pdf") ------------ 将图像对象写出
--------------------------------------------------------------------------------------
方式三:直接生成图片 ( jupter中实现)
from sklearn import tree
from IPython.display import Image
import pydotplus
dot_data = tree.export_graphviz(treeBest, out_file=None,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
七、决策树API
1、决策树分类
sklearn.tree.DecisionTreeClassifier
=============================== 决策树分类API ===========================================
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_split=1e-07, class_weight=None,
presort=False)
'''
criterion="gini", 给定纯度的度量方式,可选值gini和entropy
max_depth=None, 前置剪枝参数,用于限制决策树的深度,当决策树深度达到该值的时候,对数据不进行划分了。
min_samples_split=2,前置剪枝参数,当需要进行数据划分的时候,要求当前数据集中的样本数目至少为2个。
min_samples_leaf=1,前置剪枝参数,要求划分之后的数据集中的样本数目至少为该值。
max_leaf_nodes=None, 前置剪枝参数,一般不用,用于限制最多允许多少个叶子节点
min_weight_fraction_leaf=0., 需要在叶节点处的权重总和(所有输入样本)的最小加权分数。当未提供sample_wei-
-ght时,样本具有相同的权重。
random_state=None,
------------------------------------------------------------------------------------------
splitter="best", 防止过拟合用的....,与下面的 max_features 参数一起用,参数取值为 best/random,前者
是选取所有的特征训练,random 是随机部分特征进行训练,默认使用best,当数据量较大时,加快训练速度可以使用random
max_features=None, 防止过拟合用的....
寻找最佳分割时要考虑的功能数量:
如果是int,则在每次拆分时考虑max_features功能。
如果为float,则max_features为百分比,并 在每次拆分时考虑int(max_features * n_features)要素。
如果是“auto”,则max_features = sqrt(n_features)。
如果是“sqrt”,则max_features = sqrt(n_features)。
如果是“log2”,则max_features = log2(n_features)。
如果为None,则max_features = n_features。
注意:在找到节点样本的至少一个有效分区之前,搜索分割不会停止,即使它需要有效地检查多个
max_features功能。
min_impurity_decrease=0.,
min_impurity_split=None,
class_weight=None,
presort=False
'''
pipeline = Pipeline([
('poly',poly),
('dtree',dtree)
])
'''
属性:
feature_importances_:shape数组= [n_features]
功能重要性。功能越高,功能越重要。特征的重要性计算为该特征带来的标准的(标准化的)总减少量。它也被称为
基尼的重要性[R249]。
方法:
apply(X [,check_input]) 返回每个样本预测为的叶子的索引。
decision_path(X [,check_input]) 返回树中的决策路径
fit(X,y [,sample_weight,check_input,...]) 从训练集(X,y)构建决策树回归量。
fit_transform(X [,y]) 适合数据,然后转换它。
get_params([深]) 获取此估算工具的参数。
predict(X [,check_input]) 预测X的类或回归值。
score(X,y [,sample_weight]) 返回预测的确定系数R ^ 2。
set_params(\ * \ * PARAMS) 设置此估算器的参数。
2、决策树回归
sklearn.tree.DecisionTreeRegressor
class sklearn.tree.DecisionTreeRegressor(criterion='mse', splitter='best', max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_split=1e-07,
presort=False)
七、python决策树伪代码、代码、sklean库决策树
1、基于python代码实现决策树
....
2、基于sklearn库决策树代码
=============================== 决策树回归 ===========================================
import re,os,warnings,pydotplus
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn import tree
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
warnings.filterwarnings('ignore')
# 观察导入数据
df_data = pd.read_csv('./boston_housing.data',sep = '\s+',header = None)
# print(df_data.head(),df_data.info())
# df_data.apply(data_format) 问题一: --------------------------------- apply函数报错
# 数据清洗
df_data = df_data.astype('float64')
print(df_data.info())
# 提取特征和目标属性矩阵
X = df_data.iloc[:,:-1]
Y = df_data.iloc[:,-1]
# 数据分割
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2,random_state=100)
print(X_test.shape,Y_test.shape)
# 特征工程
poly = PolynomialFeatures(degree=2,include_bias = False)
# 构建模型
dtree = DecisionTreeRegressor(criterion='mse',max_depth=5,min_samples_split=6,min_samples_leaf=2)
'''
criterion="mse", 给定纯度的度量方式,可选值mse和mae
splitter="best", 防止过拟合用的....
max_depth=None, 前置剪枝参数,用于限制决策树的深度,当决策树深度达到该值的时候,对数据不进行划分了。
min_samples_split=2,前置剪枝参数,当需要进行数据划分的时候,要求当前数据集中的样本数目至少为2个。
min_samples_leaf=1,前置剪枝参数,要求划分之后的数据集中的样本数目至少为该值。
min_weight_fraction_leaf=0.,
max_features=None, 防止过拟合用的....
random_state=None,
max_leaf_nodes=None, 前置剪枝参数,一般不用,用于限制最多允许多少个叶子节点
min_impurity_decrease=0.,
min_impurity_split=None,
class_weight=None,
presort=False
'''
pipeline = Pipeline([
('poly',poly),
('dtree',dtree)
])
'''
特点:① 管道流内部集成fit和tranform方法,执行pipeline对象 .fit .predict 内部将自动进行特征工程转换,但要注意的是,
转化的数据不会覆盖原数据,即原数据的维度内容不会改变(相当于内部使用的是原数据的缓存数据)。
'''
# print(pipeline.get_params()['tree'])
param_grid = {
'poly__degree':[1],
'dtree__criterion':['mse','mae'],
'dtree__max_depth':[3,4,6],
'dtree__min_samples_split':[10,6],
'dtree__min_samples_leaf':[3,2]
}
gridcv = GridSearchCV(estimator=pipeline,param_grid=param_grid,cv=3)
'''
estimator= algo
param_grid = param_grid
cv= 5
注意:网格交叉验证不能接直接使用 GridSearchCV 中的模型调用内部参数,需要用网格交叉验证
gridcv.best_estimator_.get_params()['dtree'] 获取最优模型
'''
# 训练模型
gridcv.fit(X_train,Y_train)
# 模型评估
print('决策树回归预测训练集的r2值为:{}'.format(gridcv.score(X_train,Y_train)))
print('决策树回归预测测试集的r2值为:{}'.format(gridcv.score(X_test,Y_test)))
print('最优的决策树回归模型:{}'.format(gridcv.best_estimator_))
feature_importances = gridcv.best_estimator_.get_params()['dtree'].feature_importances_
treeBest = gridcv.best_estimator_.get_params()['dtree']
print('最优的决策树回归模型:{}'.format(feature_importances))
index = np.arange(len(feature_importances))
index = index[feature_importances > 0.01]
print(index)
# 可视化
Y_test_predict = gridcv.predict(X_test).reshape(-1,1)
Y_test_true = np.array(Y_test).reshape(-1,1)
fig = plt.figure()
plt.plot(Y_test_predict,'r--',label= 'predict')
plt.plot(Y_test_true,'g-',label = 'true')
plt.legend()
plt.show()
# 决策树可视化文件生成
X_ = X.iloc[:,index]
Y_ = Y
print(X_.head())
X_train1,X_test1,Y_train1,Y_test1 = train_test_split(X_,Y_,test_size=0.2,random_state=100)
print(X_train1.head())
ridge = Ridge(alpha=1.0,fit_intercept=True,solver='sag',tol=1e-4)
ridge.fit(X_train1,Y_train1)
print('r2值:{}'.format(ridge.score(X_test1,Y_test1)))
Y_test_predict1 = ridge.predict(X_test1).reshape(-1,1)
Y_test_true1 = np.array(Y_test1).reshape(-1,1)
fig = plt.figure()
plt.plot(Y_test_predict1,'r--',label= 'predict')
plt.plot(Y_test_true1,'g-',label = 'true')
plt.legend()
plt.show()
# 模型持久化