第1关:OvO多分类策略

import numpy as np# 逻辑回归
class tiny_logistic_regression(object):def __init__(self):#Wself.coef_ = None#bself.intercept_ = None#所有的W和bself._theta = None#01到标签的映射self.label_map = {}def _sigmoid(self, x):return 1. / (1. + np.exp(-x))#训练def fit(self, train_datas, train_labels, learning_rate=1e-4, n_iters=1e3):#lossdef J(theta, X_b, y):y_hat = self._sigmoid(X_b.dot(theta))try:return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) / len(y)except:return float('inf')# 算theta对loss的偏导def dJ(theta, X_b, y):return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)# 批量梯度下降def gradient_descent(X_b, y, initial_theta, leraning_rate, n_iters=1e2, epsilon=1e-6):theta = initial_thetacur_iter = 0while cur_iter < n_iters:gradient = dJ(theta, X_b, y)last_theta = thetatheta = theta - leraning_rate * gradientif (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):breakcur_iter += 1return thetaunique_labels = list(set(train_labels))labels = train_labels.copy()self.label_map[0] = unique_labels[0]labels[train_labels == unique_labels[0]] = 0self.label_map[1] = unique_labels[1]labels[train_labels == unique_labels[1]] = 1X_b = np.hstack([np.ones((len(train_datas), 1)), train_datas])initial_theta = np.zeros(X_b.shape[1])self._theta = gradient_descent(X_b, labels, initial_theta, learning_rate, n_iters)self.intercept_ = self._theta[0]self.coef_ = self._theta[1:]return self#预测概率分布def predict_proba(self, X):X_b = np.hstack([np.ones((len(X), 1)), X])return self._sigmoid(X_b.dot(self._theta))#预测def predict(self, X):proba = self.predict_proba(X)result = np.array(proba >= 0.5, dtype='int')for i in range(len(result)):if result[i] == 0:result[i] = self.label_map[0]else:result[i] = self.label_map[1]return resultclass OvO(object):def __init__(self):# 用于保存训练时各种模型的listself.models = []def fit(self, train_datas, train_labels):'''OvO的训练阶段,将模型保存到self.models中:param train_datas: 训练集数据,类型为ndarray:param train_labels: 训练集标签,类型为ndarray,shape为(-1,):return:None'''#********* Begin *********#unique_labels = list(set(train_labels))for i in range(len(unique_labels)):for j in range(i+1, len(unique_labels)):datas = train_datas[(train_labels == unique_labels[i]) | (train_labels == unique_labels[j])]labels = train_labels[(train_labels == unique_labels[i]) | (train_labels == unique_labels[j])]lr = tiny_logistic_regression()lr.fit(datas, labels)self.models.append(lr)#********* End *********#def predict(self, test_datas):'''OvO的预测阶段:param test_datas:测试集数据,类型为ndarray:return:预测结果,类型为ndarray'''#********* Begin *********#def _predict(models, test_data):# 变形test_data = np.reshape(test_data, (1, -1))vote = {}# 计票for model in models:pred = model.predict(test_data)[0]if pred not in vote:vote[pred] = 1else:vote[pred] += 1vote = sorted(vote.items(), key=lambda x: x[1], reverse=True)return vote[0][0]predict = []for data in test_datas:predict.append(_predict(self.models, data))return np.array(predict)#********* End *********#

第2关:OvR多分类策略

import numpy as np# 逻辑回归
class tiny_logistic_regression(object):def __init__(self):#Wself.coef_ = None#bself.intercept_ = None#所有的W和bself._theta = None#01到标签的映射self.label_map = {}def _sigmoid(self, x):return 1. / (1. + np.exp(-x))#训练def fit(self, train_datas, train_labels, learning_rate=1e-4, n_iters=1e3):#lossdef J(theta, X_b, y):y_hat = self._sigmoid(X_b.dot(theta))try:return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) / len(y)except:return float('inf')# 算theta对loss的偏导def dJ(theta, X_b, y):return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)# 批量梯度下降def gradient_descent(X_b, y, initial_theta, leraning_rate, n_iters=1e2, epsilon=1e-6):theta = initial_thetacur_iter = 0while cur_iter < n_iters:gradient = dJ(theta, X_b, y)last_theta = thetatheta = theta - leraning_rate * gradientif (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):breakcur_iter += 1return thetaX_b = np.hstack([np.ones((len(train_datas), 1)), train_datas])initial_theta = np.zeros(X_b.shape[1])self._theta = gradient_descent(X_b, train_labels, initial_theta, learning_rate, n_iters)self.intercept_ = self._theta[0]self.coef_ = self._theta[1:]return self#预测X中每个样本label为1的概率def predict_proba(self, X):X_b = np.hstack([np.ones((len(X), 1)), X])return self._sigmoid(X_b.dot(self._theta))#预测def predict(self, X):proba = self.predict_proba(X)result = np.array(proba >= 0.5, dtype='int')return resultclass OvR(object):def __init__(self):# 用于保存训练时各种模型的listself.models = []# 用于保存models中对应的正例的真实标签# 例如第1个模型的正例是2,则real_label[0]=2self.real_label = []def fit(self, train_datas, train_labels):'''OvO的训练阶段,将模型保存到self.models中:param train_datas: 训练集数据,类型为ndarray:param train_labels: 训练集标签,类型为ndarray,shape为(-1,):return:None'''#********* Begin *********#unique_labels = list(set(train_labels))self.real_label = unique_labels# 划分并训练for i in range(len(unique_labels)):# label变为0,1label_1 = list(np.ones(len(train_labels[train_labels == unique_labels[i]])))label_0 = list(np.zeros(len(train_labels[train_labels != unique_labels[i]])))label_1.extend(label_0)labels = np.array(label_1)data_1 = list(train_datas[train_labels == unique_labels[i]])data_0 = list(train_datas[train_labels != unique_labels[i]])data_1.extend(data_0)datas = np.array(data_1)lr = tiny_logistic_regression()lr.fit(datas, labels)self.models.append(lr)#********* End *********#def predict(self, test_datas):'''OvO的预测阶段:param test_datas:测试集数据,类型为ndarray:return:预测结果,类型为ndarray'''#********* Begin *********#def _predict(models, real_labels, test_data):# 变形test_data = np.reshape(test_data, (1, -1))max_prob = 0max_prob_idx = 0for i, model in enumerate(models):pred_prob = model.predict_proba(test_data)[0]if pred_prob > max_prob:max_prob = pred_probmax_prob_idx = ireturn max_prob_idxpredict = []for data in test_datas:predict.append(self.real_label[_predict(self.models, self.real_label, data)])return np.array(predict)#********* End *********#

educoder机器学习 --- 多分类学习相关推荐

  1. 机器学习实验——分类学习算法

    一.目的和要求 1.理解监督学习和分类学习的基本概念. 2.掌握分类学习五种算法的算法流程. 3.学会编写分类学习五种算法的Python编程方法. 4.会使用分类学习评价方法测评不同的算法性能 二.设 ...

  2. 机器学习6-多分类学习器拆分策略

    ​ 文章目录 1.一对一(One vs. One,简称OvO) 2.一对其余(One vs. Rest,简称OVR) 3.多对多(Many vs. Many,简称MvM) 参考文章: 多分类问题学习器 ...

  3. 机器学习--多分类学习

    多分类学习 基本思想 "拆解法",即:将多分类任务拆分为多个二分类任务. 先对任务进行拆分,然后为拆分出的每个二分类任务训练一个分类器:在测试时,对这些分类器的结果进行集成以获得最 ...

  4. 机器学习 --- 多分类学习

    第1关:OvO多分类策略 本关任务:根据所学知识完成基于 OvO 策略的多分类模型训练与预测,实现多分类任务. import numpy as np# 逻辑回归 class tiny_logistic ...

  5. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处

    新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...

  6. 【机器学习】多分类学习的拆分策略

    [机器学习]多分类学习 现实中常遇到多分类学习任务.有些二分类学习方法可直接推广到多分类,但在更多情形下,我们是基于一些基本策略,利用二分类学习器来解决多分类问题.所以多分类问题的根本方法依然是二分类 ...

  7. 机器学习笔记-多分类学习,类别不平衡,决策树

    读书笔记 多分类学习 基本思想:拆解法:将多分类任务拆解为若干个二分类任务求解,先对这些问题经拆分,为拆分出的每个二分类任务训练一个分类器,测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果 ...

  8. 《机器学习实战》学习笔记(四):基于概率论的分类方法 - 朴素贝叶斯

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  9. 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)

    前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...

最新文章

  1. 转 Hystrix入门指南 Introduction
  2. 基于HTML在线考试系统开题报告,基于JSP的在线考试系统 开题报告.doc
  3. MAC下 IEDA发布tomcat项目的位置
  4. java zip文件夹_如何使用java压缩文件夹成为zip包
  5. redis mysql配置文件详解_mysql配置文件my.cnf详解
  6. 非聚集索引的注意事项
  7. STC学习:八位数码管动态扫描
  8. IDEA格式化SQL代码
  9. python批量保存网页为pdf_在chrome中自动打印/保存网页为pdf - python 3.6
  10. 辽宁等保测评机构项目测评收费价格标准参考
  11. 思科本周发布一季财报:利润或继续下滑
  12. 为什么游戏模型不如原画好看?
  13. UltraEdit 27.0.0.24 中文版 — 文本代码编辑工具
  14. CANOpen SDO
  15. 春天喝这五种花草茶 身体排毒又美容养颜
  16. 【软件测试 Python自动化】全网最全大厂面试题,看完以后你就是面试官!
  17. 华为手机助手安卓版_手机资料恢复助手app下载-手机资料恢复助手app安卓版下载v1.0...
  18. docker19.03最新版本安装并配置加速器
  19. PyQt5 - 关闭当前窗体同时打开新窗体(登录界面)
  20. mc服务器怎么修改名字指令,端游网易我的世界怎么改名字

热门文章

  1. 难忘经验之平安测试面试
  2. mac幻灯片放映快捷键_如何使用预览快速制作Mac照片幻灯片
  3. 产品经理最好用的工具都在这里了
  4. 绝对定位指令DRVA和相对定位指令DRVI
  5. rust建好友服务器_rust怎么啦好友进服务器 | 手游网游页游攻略大全
  6. 服务器响应码460,王者荣耀,队友一直喊着460,到底460是哪里来的
  7. laxtex 输出度数符号
  8. mysql join和视图区别_JOIN与视图
  9. 硬盘文件无法删除(360强力删除无效)的解决方法
  10. 微信删除朋友圈多久会从服务器消失,那些从你微信朋友圈消失的人,就别再联系了,原因很简单...