第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. 2021下半年,我只想用Python搞钱!
  2. C语言入门练习 - 第二期 判断语句与循环语句(题解)
  3. css预编译其器,CSS预处理器之——Less
  4. CentOS 6使用rpm方式安装JDK8
  5. ASCII码表及说明
  6. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
  7. 互联网公司各种“花式”裁员,套路特别深,作为程序员你知道吗?
  8. MNIST手写数字识别【Matlab神经网络工具箱】
  9. matlab求逆矩阵_MPU6050姿态解算2-欧拉角amp;旋转矩阵
  10. linux下u盘病毒msdos,浅谈U盘病毒——MS-DOS.com 以及做最便民的杀毒软件
  11. 邮件代理发送功能更新和Exchange 6月份补丁更新提示
  12. 局域网共享打印机教程
  13. QTreeWidget的右键菜单实现
  14. 《FLEX工程师成长计划》--入门篇之一:关于此书
  15. 数据防泄密软件可以解决哪些安全问题?
  16. Mac 编译安装zlib
  17. ECharts动态加载数据绘制折线图
  18. 超20城急推购房补贴 地方救市力度接近2008年
  19. Windows服务安装卸载 Windows清理实用工具 SQL2000安装挂起修复工具绿色版
  20. 澳洲服务器拳头账号怎么注册,云顶之弈手游澳服账号怎么注册 澳洲服拳头账号注册方法分享...

热门文章

  1. 《知识英雄2.0》台湾版序
  2. Nginx 部署前端项目dist文件
  3. es5中foreach的用法
  4. 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)
  5. 「镁客早报」美国加州法院暂时冻结了贾跃亭在FF中的股权;最迟明年全国将提供手机卡异地销户服务... 1
  6. 四则你不知道的QQ绝密技巧!
  7. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用
  8. 最新风很大的Rummy到底是什么?做个简单的知识科普
  9. 01 | 23届秋招嵌入式岗位薪资情况汇总
  10. A股2017十大TOP10,大数据榜单透视A股赚钱基因!