跳到主要内容

2.3 课后作业(二)

指导书要求如下:

  1. 用 Python 实现 F1-score,并自己构建一个简易数据集进行测试。
  2. 用 Python 中的 for 循环、列表推导式,分别实现计算:1+2+3+...+1000。
  3. 随机生成一个五列十行的 Dataframe 的数据类型,行列索引自定义,绘制出对应的柱状图、散点图,以及在查询官网学习绘制一个课程未讲解(即除柱状图、饼图、散点图、箱线图以外的图形)的数据分析图形。

2.3.1 F1-score

指导书要求自己构建数据集计算 F1-score,于是考虑做如下模拟:

  1. 随机生成一个 int 类型的数组,长度为 500,范围 [0,1000][0, 1000],假定 [0,500)[0, 500) 为反例,[500,1000][500, 1000] 为正例。
  2. 现模拟一个二分类器,将 [0,300)(800,1000][0, 300) \cup (800, 1000] 预测为反例,[300,800][300, 800] 预测为正例。
  3. 理论上此二分类器的 F1-score 应为 0.6。

代码如下:

def f1_score() -> float:
"""
计算 F1-score。
随机生成一个 int 类型的数组,长度为 500,范围 [0, 1000],假定 [0, 500) 为反例,[500, 1000] 为正例。
现模拟一个二分类器,将 [0, 300)U(800, 1000] 预测为反例,[300, 800] 预测为正例。
理论上此二分类器的 F1-score 应为 0.6。
:return: F1-score
"""
dataset = numpy.random.randint(low=0, high=1001, size=500)
logger.info(f"随机生成数据集:\n{dataset}")
tp = len([x for x in dataset if 500 <= x <= 800])
logger.info(f"真正例:{tp}")
fp = len([x for x in dataset if 300 <= x < 500])
logger.info(f"假正例:{fp}")
tn = len([x for x in dataset if 0 <= x < 300])
logger.info(f"真反例:{tn}")
fn = len([x for x in dataset if 800 < x <= 1000])
logger.info(f"假反例:{fn}")
result = 2 * tp / (2 * tp + fp + fn)
logger.info(f"F1-score:{result}")
return result

2.3.2 求和

求和太简单了,略。

2.3.3 画图

指导书要求从官网上查一个指导书没讲过的图,并自己构建数据画出来。

官方文档链接:API Reference - pandas 0.23.1 documentation

官网展示了每个图的实例代码及其图例,这里不再赘述。