python之zipfile

通常文件都是以.zip形式保存的,在python中如何读取zip文件呢?python的zipfile库可以帮助你。

# 导入zipfile

import zipfile

# 创建一个zip对象

f = zipfile.ZipFile(r'/tmp/text8.zip')

# 获取所有文件列表

f.namelist()

# 读取文件,返回的是二进制数据(byte)

f.read(f.namelist()[0])

# 转化为str格式

import tensorflow as tf

tf.compat.as_str(f.read(f.namelist()[0])

# 利用空格进行分割

tf.compat.as_str(f.read(f.namelist()[0]).split()

这里只介绍关于zipfile的部分函数,更多的内容请参考:python3中zipfile模块的常用方法 - 天王盖地虎宝塔镇河妖 - 博客园​www.cnblogs.com

collections.Counter()函数。Counter()函数,如其名,实现一个计算功能,返回list。

from collections import Counter

Counter(['a', 'a', 'a', 'b', 'b', 'c'])

# Counter({'a': 3, 'b': 2, 'c': 1})

Counter(['a', 'a', 'a', 'b', 'b', 'c']).most_common(2)

#[('a', 3), ('b', 2)]

快速构建字典:dict(zip(dictionary.values, dictionary.keys()

评测指标之AUC

auc为曲线下方的面积,全称为area under the curve,曲线为接收者操作特性曲线,roc。roc曲线的横坐标是伪阳性率(false positive rate),纵坐标为真阳性率(true postive rate)。对于一个二分类问题,预测值和真实值之间的关系存在以下四种关系:Fig.1 二维混淆矩阵

真阳性率 = 真阳性数量 / (真阳性数量 + 伪阴性数量),伪阳性率 = 伪阳性数量 / (伪阳性数量 + 真阴性数量)。对于二分类问题,预测的是正样本的概率,设定一个阈值后,可以得到正负样本(0 或者 1),进而得到(真阳性率,伪阳性率),取不同的阈值可以得到不同的(真阳性率,伪阳性率),将这些点描绘出来连成线便得到roc曲线:)。Fig.2 Receiver Operating Characteristic Curve

AUC的统计意义,从所有的正样本中随机的取一个正样本,从所有的负样本中随机的取一个负样本,当前score使得正样本排在负样本前面的概率。在实际计算的时候,可以使用公式:

其中

为正样本数量,

为负样本数量。auc的计算代码及roc曲线的绘制代码如下:

#!/usr/bin/env python

#-*- coding: utf-8 -*-

# ******************************************************************************

# 程序名称: roc_auc_score.py

# 功能描述: 计算roc曲线下方的面积

# 创建人名: aylanyang

# 创建日期: 2019-09-03

# 版本说明: v1.0

# ******************************************************************************

## import

import numpy as np

from sklearn.metrics import roc_auc_score, roc_curve

import matplotlib.pyplot as plt

def roc_auc_score_v1(prob, label):

''':param prob: 预测值:param label: 真实值:return: auc'''

listTuple = list(zip(label, prob))

rank = [values2 for values1, values2 in sorted(listTuple, key=lambda x: x[0])]

rankList = [i+1 for i in range(len(rank)) if rank[i]==1]

posNum = 0

negNum = 0

for i in range(len(label)):

if(label[i] == 1):

posNum += 1

else:

negNum += 1

auc = (sum(rankList) - (posNum*(posNum+1))/2)/(posNum*negNum)

return auc

def plot_roc(label, prob):

fpr, tpr, _ = roc_curve(label, prob, pos_label=1)

plt.figure()

plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC Curve (Area ={:.2f}'.format(roc_auc_score(label, prob)))

plt.plot([0, 1], [0, 1], color='navy', linestyle='--')

plt.xlim([0, 1])

plt.ylim([0, 1.05])

plt.xlabel('False Positive Rate')

plt.ylabel('True Postive Rate')

plt.title('Receiver Operating Characteristic Curve')

plt.legend(loc='lower right')

plt.savefig('roc.png')

plt.show()

if __name__ == "__main__":

prob = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

label = np.array([0, 0, 0, 1, 0, 1, 1, 0, 1])

auc = roc_auc_score_v1(label, prob)

print('roc auc score:{:.4f}'.format(auc))

auc = roc_auc_score(label, prob)

print('roc auc score:{:.4f}'.format(auc))

plot_roc(label, prob)

评价指标之GAUC

GAUC,全称为Group AUC。提出GAUC的动机如下:在推荐系统中,希望做到个性化推荐,为每一个用户推荐该用户感兴趣的物品,而AUC指标是对总体排序能力的一种衡量,可能不太适用于评价个性化推荐的效果。举个简单的例子:有两个用户,分别是甲和乙,5个样本。将模型A的预测从小到大排序之后,结果为:甲-,甲+,乙-,甲+,乙+。将模型B的预测从小到大排序之后,结果为:甲-,甲+,甲+,乙-,乙+。使用前面的公式计算得到模型A的AUC为:0.833; 模型B的AUC为:0.667。从AUC的指标来看,模型A要比模型B更优。但是如果单看用户甲,模型A的预测结果为:甲-,甲+,甲+,模型B的预测结果也是:甲-,甲+,甲+。对用户甲而言,模型A和模型B的效果是一样的。单看用户乙,模型A和模型B的结果也是一样的。GAUC的思路就是以用户为单位计算AUC指标,之后求各个用户的加权AUC。对于所举的例子,模型A的GAUC为: GAUC_A=W_甲×AUC_甲 + W_乙×AUC_乙=0.6× AUC_甲 + 0.4×AUC_乙; 模型B的AUC为:GAUC_B=W_甲×AUC_甲 + W_乙×AUC_乙=0.6× AUC_甲 + 0.4×AUC_乙。

其中

表示用户,

表示用户

的出现次数,

表示用户

GAUC的代码实现:

#!/usr/bin/env python

#-*- coding: utf-8 -*-

# ******************************************************************************

# 程序名称: gauc.py

# 功能描述: 计算group auc

# 创建人名: aylanyang

# 创建日期: 2019-09-03

# 版本说明: v1.0

# ******************************************************************************

## import

import numpy as np

from sklearn.metrics import roc_auc_score

from collections import defaultdict

def gauc(label, pred, user_id):

''':param label: ground truth:param prob: predicted prob:param user_id: user index:return: gauc'''

if(len(label) != len(user_id)):

raise ValueError("impression id num should equal to the sample num,"\

"impression id num is{}".format(len(user_id)))

group_truth = defaultdict(lambda: [])

group_score = defaultdict(lambda: [])

for idx, truth in enumerate(label):

uid = user_id[idx]

group_truth[uid].append(label[idx])

group_score[uid].append(pred[idx])

group_flag = defaultdict(lambda: False)

for uid in set(user_id):

truths = group_truth[uid]

for i in range(len(truths)-1):

if(truths[i] != truths[i+1]):

flag = True

break

group_flag[uid] = flag

total_auc = 0

total_impression = 0

for uid in group_flag:

if group_flag[uid]:

total_auc += len(group_truth[uid]) * roc_auc_score(np.asarray(group_truth[uid]), np.asarray(group_score[uid]))

total_impression += len(group_truth[uid])

group_auc = float(total_auc) / total_impression

group_auc = round(group_auc, 4)

return group_auc

if __name__ == '__main__':

user_id = ['a', 'a', 'a', 'b', 'b', 'b', 'a']

label = [1, 0, 1, 0, 1, 1, 0]

pred = [0.4, 0.5, 0.7, 0.2, 0.6, 0.7, 0.4]

group_auc = gauc(label, pred, user_id)

print('group_auc:{:.4f}'.format(group_auc))

auc = roc_auc_score(label, pred)

print("auc:{:.4f}".format(auc))

GAUC的参考资料:https://github.com/qiaoguan/deep-ctr-prediction/blob/master/DeepCross/metric.py​github.com

MapReduce并行化优化算法

纵所周知,优化算法有随机梯度下降(一次用一个样本),mini-batch learning(小批量梯度下降),batch learning(全样本梯度下降),online learning(一次用一个样本,如FTRL)。那么,哪些算法可以通过Mapreduce的方式并行化呢?如下图所示,batch gradient descent算法需要将batch内的所有样本的损失求和,这个步骤可以使用MapReduce机制并行化。SGD或者online learning不能通过MapReduce机制并行化。Fig.3 MapReduce 并行化 batch gradient

参考资料:大规模机器学习(Large Scale Machine Learning)​www.jianshu.com

评价指标之相对信息增益(RIG)

先复习相关知识,离散随机变量X的熵为:

在条件

已知的情况下,

的相对熵为:

熵与条件熵的差值为信息增益(Information Gain):

信息增益值的大小是相对数据集而言的,并没有绝对的意义,在分类问题比较困难的时候,也就是训练数据集的经验熵比较大的时候,信息增益的值比较大,反之,信息增益值会偏小。使用相对信息增益(信息增益比)可以对这一个问题进行校正,相对信息增益(Relative Information Gain):

评价指标之Normalized Cross Entropy

Normalized Cross Entropy(NE),即归一化的交叉熵。

评价指标之logloss

logloss长得和交叉熵很像:)

参考资料:金柔:算法工程师技能树(三):非深度CTR预估​zhuanlan.zhihu.comCalculation of relative information gain for multiple splits in decision trees​stats.stackexchange.com

相关python代码

#!/usr/bin/env python

#-*- coding: utf-8 -*-

# ******************************************************************************

# 程序名称: normalized_cross_entropy.py

# 功能描述: 计算Normalized Cross Entropy (NE)

# 创建人名: aylanyang

# 创建日期: 2019-09-05

# 版本说明: v1.0

# ******************************************************************************

## import

import numpy as np

def cross_entropy(label, prob):

"""只适用二分类问题:param label: numpy array, shape(n,):param prob: numpy array, shape(n,):return: cross entropy"""

if(label.shape != prob.shape):

raise ValueError('label shape should be equal to the prob shape, '\

'label shape is{}, prob shape is{}'.format(label.shape, prob.shape))

return (-1.0/len(label))*sum(label*np.log(prob) + (1-label)*np.log(1-prob))

def normalized_cross_entropy(label, prob, avg_prob):

"""只适用二分类问题:param label: numpy array, shape(n,):param prob: numpy array, shape(n,):param avg_prob: average probability:return: normalized cross entropy"""

if(label.shape != prob.shape):

raise ValueError('label shape should be equal to the prob shape, '\

'label shape is{}, prob shape is{}'.format(label.shape, prob.shape))

num = (-1.0/len(label))*sum(label*np.log(prob) + (1-label)*np.log(1-prob))

den = -1.0*(avg_prob*np.log(avg_prob) + (1-avg_prob)*np.log(1-avg_prob))

return num/den

def log_loss(label, prob):

"""只适用二分类问题:param label: numpy array, shape(n,):param prob: numpy array, shape(n,):return: cross entropy"""

if(label.shape != prob.shape):

raise ValueError('label shape should be equal to the prob shape, '\

'label shape is{}, prob shape is{}'.format(label.shape, prob.shape))

return (-1.0/len(label))*sum(label*np.log(prob) + (1-label)*np.log(1-prob))

python文本分类评价指标 top1如何计算_推荐算法评价指标相关推荐

  1. python文本分类评价指标 top1如何计算_使用paddlehub自定义任务,具体是自定义文本分类任务中的评价指标时按照官方文档的方法做了之后报错了,请问应该如何解决?...

    ### 我的版本.环境信息 1)PaddleHub 1.8.2和PaddlePaddle版本1.8.4 2)系统环境:在Windows的AiStudio网页端跑的,python版本为3.7 复现信息: ...

  2. python 文本分类卡方检验_中文文本分类:你需要了解的10项关键内容

    文本分类指的是计算机通过算法对输入的文本按照一定的类目体系进行自动化归类的过程.在人工智能浪潮席卷全球的今天,文本分类技术已经被广泛地应用在文本审核.广告过滤.情感分析和反黄识别等NLP领域.本文从达 ...

  3. python文本分类_教你用python做文本分类

    什么是文本分类 一个文本分类问题就是将一篇文档归入预先定义的几个类别中的一个或几个.通俗点说,就是拿一篇文章,问计算机这文章要说的究竟是体育,经济还是教育.文本分类是一个监督学习的过程,常见的应用就是 ...

  4. Python文本分类(不涉及算法)

    Python文本分类 ** 首先下载安装,用到的库有pandas和jieba库 这个文本分类很简单,并不涉及算法 ** 源数据是二个excel文件,大约7000条数据,首先把二个文件进行合并成一个DF ...

  5. 推荐系统系列——推荐算法评价指标

    文章目录 同步读书之<菜根谭> 9.静坐观心,真妄毕现 10.得意早回头,拂心莫停手 推荐算法评价指标 1 评分预测指标 1.1 符号定义 1.2 平均绝对误差 1.3 均方根误差 1.4 ...

  6. python文本分类评价指标 top1如何计算_python – Keras:如何计算多标签分类的准确......

    我正在做有毒评论文本分类Kaggle挑战.有6个类:['威胁','严重毒性','淫秽','侮辱','身份_用','有毒'].注释可以是这些类的多个,因此它是一个多标签分类问题. 我用Keras建立了一 ...

  7. python文本分类特征选择_文本挖掘之特征选择(python 实现)

    机器学习算法的空间.时间复杂度依赖于输入数据的规模,维度规约(Dimensionality reduction)则是一种被用于降低输入数据维数的方法.维度规约可以分为两类: 特征选择(feature ...

  8. python文本分类算法_基于Naive Bayes算法的文本分类

    理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关.举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果 ...

  9. python文本分类_手把手教你在Python中实现文本分类.pdf

    手把手教你在Python 中实现文本分类(附代码.数 据集) 引言 文本分类是商业问题中常见的自然语言处理任务,目标是自动将文本文件分到一个 或多个已定义好的类别中.文本分类的一些例子如下: • 分析 ...

  10. python文本分类模型_下载 | 最全中文文本分类模型库,上手即用

    原标题:下载 | 最全中文文本分类模型库,上手即用 本文转自『大数据文摘』 如何选择合适的模型上手进行中文文本分类呢? 别慌,福利来了,GitHub上一位名为"huwenxing" ...

最新文章

  1. python yield用法_Python中迭代器和生成器的区别?
  2. zabbis监控mysql数据库
  3. Java中映射怎么实现_我们如何在Java 9的JShell中实现映射?
  4. breeze源码阅读心得
  5. Parse Fatal Error at line 4 column 43: 已经为元素 web-app 指定属性 xmlns。
  6. 《Java从入门到放弃》JavaSE入门篇:文件操作
  7. python 常用包_Python常用指引
  8. python删除列表中的重复值_如何从 Python 列表中删除重复项
  9. Ubuntu Pycharm启动后卡住无法操作
  10. c#中Dictionary、ArrayList、Hashtable和数组 Array 的区别(转)
  11. C语言 二维数组定义和使用 - C语言零基础入门教程
  12. 2.掌握Python基本数据类型,从python陌路人到熟人!
  13. 反转map的key-value
  14. 比较各种SpA分类标准
  15. html代码雨特效代码,html开发数字雨特效代码 - 贪吃蛇学院-专业IT技术平台
  16. 介绍一种养眼的IDEA/Pycharm/Clion配色方案
  17. python调用def函数的格式_Python 函数def 模块调用函数方法及全局变量
  18. 电脑录屏快捷键是什么?电脑录屏是什么键
  19. 征途LINUX服务端脚本技术,腾讯征途手游脚本 辅助基本语法
  20. (附源码)ssm南工二手书交易平台 毕业设计172334

热门文章

  1. H.264/AVC率失真优化( RDO) 策略研究
  2. 定时器函数执行原理揭秘
  3. php过滤iframe,php过滤XSS攻击的函数
  4. java中将date插入mysql中date_Java代码中Date类型插入到mysql数据库中数值不一致
  5. 手工安装hr表+oracle,[20200825]手工安装HR schema.txt
  6. python文件操作with语句是不是不用关闭文件_分析用Python脚本关闭文件操作的机制...
  7. 用户使用双屏扩展桌面类软件时,所遇到的主要疑难问题汇编
  8. tp3.2 访问地址url大小写及控制器多个单词组成时url
  9. elasticsearch 7.0.1 + kibana + elasticsearch-analysis-ik 7.0.0 安装和配置过程中问题备忘录...
  10. 局域网无法访问共享新方法