1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Oct 31 20:59:39 2018
  4. 脚本描述:采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
  5. @author: WZD
  6. """
  7. from sklearn.datasets import load_breast_cancer
  8. from sklearn.model_selection import train_test_split
  9. import numpy as np
  10. from xgboost import XGBClassifier
  11. from sklearn.metrics import confusion_matrix
  12. import pandas as pd
  13. from seaborn import load_dataset
  14. from sklearn.externals import joblib
  15.  
  16. ###################准备训练数据和测试数据#######################################
  17. df = load_dataset(name="titanic")
  18. df = df[["survived","pclass","age","sibsp","parch"]]
  19. feature_name = ["pclass","age","sibsp","parch"]
  20. label_name = ["survived"]
  21.  
  22. train,test = train_test_split(df,test_size=0.2)
  23.  
  24. ##################训练过程####################################################
  25. #L1,采用全部训练数据
  26. model_1 = XGBClassifier(max_depth=5,n_estimators=10)
  27. model_1.fit(train[feature_name],train[label_name])
  28. #采用model_1预测训练数据
  29. y_model_1_pred = model_1.predict(train[feature_name])
  30. #保存L1模型
  31. model_1_path = joblib.dump(model_1,filename="./model_1.pkl")
  32. #将L1模型的预测结果接在训练数据后面
  33. train["y_model_1_pred"] = y_model_1_pred
  34.  
  35. #从train中分离出预测正确和错误的数据集
  36. train_1_right = train[train["survived"]==train["y_model_1_pred"]]
  37. train_1_error = train[train["survived"]!=train["y_model_1_pred"]]
  38.  
  39. #比价分错样本和正确样本的数量大小,小的那一个采样全部样本,大的那一个采样和小的同数量的样本
  40. num_min = min(len(train_1_error),len(train_1_right))
  41. train_2 = pd.concat([train_1_error.sample(n=num_min),train_1_right.sample(n=num_min)])
  42. #L2,采用train_2数据集
  43. model_2 = XGBClassifier(max_depth=1,n_estimators=1)
  44. model_2.fit(train_2[feature_name],train_2[label_name])
  45. #采用model_2预测train_2数据集
  46. y_model_2_pred = model_2.predict(train_2[feature_name])
  47. #保存L2模型
  48. model_2_path = joblib.dump(model_2,filename="./model_2.pkl")
  49.  
  50. #将L2模型的预测结果接在train_2数据集后面
  51. train_2["y_model_2_pred"] = y_model_2_pred
  52.  
  53. #提取train_2中分类错误的样本
  54. #train_3 = train_2[train_2["survived"]!=train_2["y_model_2_pred"]]
    train_3 = train_2[train_2["y_model_1_pred"]!=train_2["y_model_2_pred"]]#这里不是太清楚使用上面的那一条,还是这一条
  55. #L3,采用train_3数据集
  56. model_3 = XGBClassifier(max_depth=1,n_estimators=1)
  57. model_3.fit(train_3[feature_name],train_3[label_name])
  58. #采用model_3预测train_3数据集
  59. y_model_3_pred = model_3.predict(train_3[feature_name])
  60. #保存L3模型
  61. model_3_path = joblib.dump(model_3,filename="./model_3.pkl")
  62.  
  63. ##############在测试集上测试模型的效果#########################################
  64. y_result = pd.DataFrame()
  65.  
  66. y_result["model_1"] = model_1.predict(test[feature_name])
  67. y_result["model_2"] = model_2.predict(test[feature_name])
  68. y_result["model_3"] = model_3.predict(test[feature_name])
  69.  
  70. def vote(x,y,z):
  71. label_0 = 0
  72. label_1 = 0
  73. if x==0:
  74. label_0 += 1
  75. else:
  76. label_1 += 1
  77.  
  78. if y==0:
  79. label_0 += 1
  80. else:
  81. label_1 += 1
  82.  
  83. if z==0:
  84. label_0 += 1
  85. else:
  86. label_1 += 1
  87.  
  88. if label_0>=label_1:
  89. return 0
  90. else:
  91. return 1
  92.  
  93. y_result["result"] = y_result.apply(lambda df:vote(df["model_1"],df["model_2"],df["model_3"]),axis=1)
  94. confusion_matrix(test[label_name],y_result["result"])

采用boosting思想开发一个解决二分类样本不平衡的多估计器模型的更多相关文章

  1. 如何利用开源思想开发一个SEO友好型网

    如果你有一个网站需要去做SEO优化的时候,不要期望你的努力能立即得到回报.耐心等待并更正内容营销策略,最终会发现你的网站很受用户欢迎.下面就教你如何利用开源思维开发一个SEO友好型网站! 首先,你应该 ...

  2. 【笔记】二分类算法解决多分类问题之OvO与OvR

    OvO与OvR 前文书道,逻辑回归只能解决二分类问题,不过,可以对其进行改进,使其同样可以用于多分类问题,其改造方式可以对多种算法(几乎全部二分类算法)进行改造,其有两种,简写为OvO与OvR OvR ...

  3. [AI开发]一个例子说明机器学习和深度学习的关系

    深度学习现在这么火热,大部分人都会有‘那么它与机器学习有什么关系?’这样的疑问,网上比较它们的文章也比较多,如果有机器学习相关经验,或者做过类似数据分析.挖掘之类的人看完那些文章可能很容易理解,无非就 ...

  4. 监督学习——logistic进行二分类(python)

    线性回归及sgd/bgd的介绍: 监督学习--随机梯度下降算法(sgd)和批梯度下降算法(bgd) 训练数据形式:          (第一列代表x1,第二列代表 x2,第三列代表 数据标签 用 0/ ...

  5. 【机器学习具体解释】SVM解二分类,多分类,及后验概率输出

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51073885 CSDN−勿在浮沙筑高台 支持向量机(Support Vecto ...

  6. 二分类模型之logistic

    liner classifiers 逻辑回归用在2分类问题上居多.它是一个非线性的回归模型,其最大的好处恰恰是可以解决二元类问题,目前在金融行业,基本都是使用Logistic回归来预判一个用户是否为好 ...

  7. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  8. iOS开发一个用户登录注册模块需要解决的坑

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...

  9. iOS 11开发教程(二)编写第一个iOS 11应用

    iOS 11开发教程(二)编写第一个iOS 11应用 编写第一个iOS 11应用 本节将以一个iOS 11应用程序为例,为开发者讲解如何使用Xcode 9.0去创建项目,以及iOS模拟器的一些功能.编 ...

随机推荐

  1. sudo权限的设置

    什么是sudo,为什么要sudo呢?就我个人愚见普通用户sudo之后拥有root用户的所有权限,其优点在于,虽然该用户拥有root权限,但他却不需要知道root用户密码,需要输入的是他本身的密码. 那 ...

  2. day45 html 初识,常见命令

    Web服务本质 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文件内容发给浏览器 --> 浏览器渲染页面 浏 ...

  3. 使用apache cxf实现webservice服务

    1.在idea中使用maven新建web工程并引入spring mvc,具体可以参考https://www.cnblogs.com/laoxia/p/9311442.html; 2.在工程POM文件中 ...

  4. TypeScript 之 类型推导

    https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Type%20Inference.html 类型推导:发生在初始化变 ...

  5. react 知识点2

    从 render 函数可以看出来,组件内部是通过 this.props 的方式获取到组件的参数的,如果 this.props 里面有需要的属性我们就采用相应的属性,没有的话就用默认的属性. 那么怎么把 ...

  6. 配置hive元数据数据库

    <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <v ...

  7. MAC JDK默认安装路径 JAVA路径

    打开终端,执行     /usr/libexec/java_home -V 默认JDK1.6(Apple自带JDK)路径:   /System/Library/Java/JavaVirtualMach ...

  8. Delphi中如何进行BASE64解码

    //方法1: uses EncdDecd; Memo2.Text:=UTF8Decode( DecodeString(Memo1.Text)); //方法2: // 使用控件 Memo2.Text:= ...

  9. XE5开发Android程序调用电话相关功能(短信息和电话) [转]

    其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...

  10. Docker-compose ports和expose的区别

    docker-compose中有两种方式可以暴露容器的端口:ports和expose. 1 ports ports暴露容器端口到主机的任意端口或指定端口,用法: ports: - "80:8 ...