模型评估

模型评估 此节内容只针对分类模型,使用sklearn库 1、准确率 accuracy_score函数计算精度,在多标签分类中,该函数返回子集精度。如果样本的整个预测标签集与真实的标签集严格匹配,则子集精度为1.0; 否则它是0.0。如果$\hat{y}i$是第$i$类样本预测值,$y_i$是相应的真值,那么正确预测的分数$n\text{samples}$被定义为$$\texttt{accuracy}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples}-1} 1(\hat{y}_i = y_i)$$ import numpy as np from sklearn.metrics import accuracy_score y_pred = [0, 2, 1, 3] y_true = [0, 1, 2, 3] accuracy_score(y_true, y_pred) 0.5 accuracy_score(y_true, y_pred, normalize=False) # 若normalize为False,则返回正确分类的样本数 2 2、混淆矩阵 该confusion_matrix函数通过计算混淆矩阵来评估分类准确性,行对应于真正的类,列表示预测值。 from sklearn.metrics import confusion_matrix y_true = [2, 0, 2, 2, 0, 1] y_pred = [0, 0, 2, 2, 0, 2] confusion_matrix(y_true, y_pred) array([[2, 0, 0], [0, 0, 1], [1, 0, 2]]) 3、汉明损失 如果$\hat{y}j$是预测为第$j$类的样本,$y_j$是真值,$n\text{labels}$是类别的数目,则两个样本之间的汉明损失定义为:$$L_{Hamming}(y, \hat{y}) = \frac{1}{n_\text{labels}} \sum_{j=0}^{n_\text{labels} - 1} 1(\hat{y}_j \not= y_j)$$ $1(x)$是指标函数...

February 25, 2021 · 2 min · 李昌

正则表达式

正则表达式 1、什么是正则表达式 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。(摘自百度百科) 你可能熟悉文本查找,即按下 Ctrl-F,输入你要查找的词。“正则表达式”更进一步,它们让你指定要查找的“模式”。你也许不知道一家公司的准确电话号码,但如果你住在美国或加拿大,你就知道有3 位数字,然后是一个短横线,然后是 4 位数字(有时候以 3 位区号开始)。因此作为一个人,你看到一个电话号码就知道:415-555-1234 是电话号码,但 4,155,551,234 不是。 正则表达式很有用,但如果不是程序员,很少会有人了解,它,尽管大多数现代文本编辑器和文字处理器(诸如微软的 Word 或 OpenOffice)都有查找和查找替换功能,可以根据正则表达式查找。正则表达式可以节约大量时间,不仅适用于软件用户,也适用于程序员。实际上,技术作家 Cory Doctorow 声称,甚至应该在教授编程之前,先教授正则表达式: “知道[正则表达式]可能意味着用 3 步解决一个问题,而不是用 3000 步。如果你是一个技术怪侠,别忘了你用几次击键就能解决的问题,其他人需要数天的烦琐工作才能解决,而且他们容易犯错。” 1 (摘自《Python编程快速上手—让繁琐工作自动化》) 2、不用正则表达式来查找文本模式 假设你希望在字符串中查找电话号码。你知道模式:3 个数字,一个短横线,3 个数字,一个短横线,再是 4 个数字。例如:415-555-4242。 假定我们用一个名为 isPhoneNumber()的函数,来检查字符串是否匹配模式,它 返回 True 或 False。 def isPhoneNumber(text): if len(text) != 12: return False for i in range(0, 3): if not text[i].isdecimal(): return False if text[3] != '-': return False for i in range(4, 7): if not text[i]....

February 25, 2021 · 2 min · 李昌

温度预测

温度预测 1. 观察耶拿天气数据集的数据 import os fname = './data/jena_climate_2009_2016.csv' f = open(fname) data = f.read() f.close() lines = data.split('\n') header = lines[0].split(',') lines = lines[1:] print(header) print(len(lines)) ['"Date Time"', '"p (mbar)"', '"T (degC)"', '"Tpot (K)"', '"Tdew (degC)"', '"rh (%)"', '"VPmax (mbar)"', '"VPact (mbar)"', '"VPdef (mbar)"', '"sh (g/kg)"', '"H2OC (mmol/mol)"', '"rho (g/m**3)"', '"wv (m/s)"', '"max. wv (m/s)"', '"wd (deg)"'] 420551 # 解析数据 import numpy as np float_data = np.zeros((len(lines), len(header) - 1)) for i, line in enumerate(lines): values = [float(x) for x in line....

February 25, 2021 · 2 min · 李昌

理解LSTM层与GRU层

理解LSTM层与GRU层 SimpleRNN的问题在于,在时刻t,理论上来说,它应该能够记住许多时间部之前见过的各种信息,但实际上它是不可能学到这种长期依赖的。其原因在于“梯度消失”问题,这一效应类似于在层数较多的非循环网络中观察到的效应,随着层数的增加,网络最终变得无法训练。 1. LSTM层 LSTM层是SimpleRNN的一种变体,它增加了一种携带信息跨越多个时间步的方法。假设有一条传送带,其运行方向平行于你所处理的序列。序列中的信息可以在任意位置跳上传送带,然后被传送到更晚的时间步,并在需要时原封不动地跳回来。这实际上就是LSTM的原理:它保存信息以便后面使用,从而防止较早期的信号在处理过程中逐渐消失。 1.1 Keras 中一个LSTM的例子 # 准备数据 from keras.datasets import imdb from keras.preprocessing import sequence max_features = 10000 maxlen = 500 batch_size = 32 print('Loading data...') (input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features) print(len(input_train), 'train_sequences') print(len(input_test), 'test sequences') print('Pad sequences (samples x time)') input_train = sequence.pad_sequences(input_train, maxlen=maxlen) input_test = sequence.pad_sequences(input_test, maxlen=maxlen) print('input_train shape: ', input_train.shape) print('input_test shape:', input_test.shape) Loading data... 25000 train_sequences 25000 test sequences Pad sequences (samples x time) input_train shape: (25000, 500) input_test shape: (25000, 500) # 使用Keras中的LSTM层 from keras....

February 25, 2021 · 2 min · 李昌

理解循环神经网络

理解循环神经网络 1. 简单的循环神经网络 RNN以渐进的方式处理信息,同时保存一个关于所处理内容的内部模型,这个模型是根据过去的信息构建的,并随着新信息的进入而不断更新。 RNN处理序列的方式是:遍历所有序列元素,并保存一个状态(State),其中包含与已查看内容相关的信息。 RNN的伪代码: state_t = 0 for input_t in input_sequence: output_t = f(input_t, state_t) state_t = output_t 可以给出具体的函数f,从输入和状态到输出的变换,其参数包括两个矩阵(W和U)和一个偏置向量。它类似于前馈网络中密集连接层所做的变换。 state_t = 0 for input_t in input_sequence: output_t = activation(dot(W, input_t) + dot(U, state_t) + b) state_t = output_t # 简单RNN的numpy实现 import numpy as np timesteps = 100 # 输入序列的时间步数 input_features = 32 # 输入特征空间的维度 output_features = 64 # 输出特征空间的维度 inputs = np.random.random((timesteps, input_features)) # 输入数据:随机噪声,仅作为示例 state_t = np.zeros((output_features,)) # 初试状态:全零向量 # 创建随机的权重矩阵 W = np....

February 25, 2021 · 4 min · 李昌

类型断言

类型断言 类型断言是一个使用在接口上的操作,语法上看起来像是x.(T),因此被称为断言类型,这里x是接口,T是类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。 这里有两种可能: 如果断言的类型T是一个具体类型 类型断言检查x的动态类型是否和T相同。如果检查成功了,类型断言的结果是x的动态值,即T。换句话说,具体类型的类型断言从它的操作对象中获得具体的值。如果检查失败,接下来这个操作会panic。 import ( "io" "os" "bytes" "fmt" ) var w io.Writer w = os.Stdout f := w.(*os.File) // 类型检查成功了,所以f的值为os.Stdout f == os.Stdout // true fmt.Printf("%p", f) 输出 0xc0004560c0 c := w.(*bytes.Buffer) // 类型检查失败 输出 interface conversion: <io.Writer> is <*os.File>, not <*bytes.Buffer> 断言的类型T是一个接口类型 t, ok := i.(T) 如果i是类型T(实现了T接口),即检查成功了,那么t将是i的原值,ok为true;如果检查失败了,t将为T类型的零值,ok为false,并且不引发panic。 对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大), 但是它保护了接口值内部的动态类型和值的部分。 var w io Wirter w = os.Stdout rw := w....

February 25, 2021 · 1 min · 李昌

网页静态文件找不到

网页静态文件找不到 在19-2-18的开始,突然发现网页的静态文件找不到了 在将static目录移动到app目录内之后,发现网页可以正常显示。 原来static目录是和app目录一个层级 针对此问题的思考 STATIC_URL = ‘/static/’ 注意此处是url,即对于静态文件的定位,这是必要的前提配置 STATIC_URL的定义制定了静态资源的url,具体指各个app下的static目录 STATIC_ROOT = os.path.join(BASE_DIR, “static”) STATIC_ROOT是总的static目录,主要用于在运行 collectstatic命令时存储所有的静态文件 STATICFILES_DIRS = [os.path.join(BASE_DIR, “static”), ‘mysite/static’,] STATICFILES_DIRS是一个列表,存放各个app的static目录及公共的static目录 ​ 官网配置 确保django.contrib.staticfiles包含在您的 INSTALLED_APPS。 在您的设置文件中,定义STATIC_URL,例如: STATIC_URL = '/static/' 在模板中,使用static模板标记使用已配置的相对路径构建URL STATICFILES_STORAGE。 {% load static %} <img src="{% static "my_app/example.jpg" %}" alt="My image"/> 将静态文件存储static在应用程序中调用的文件夹中。例如my_app/static/my_app/example.jpg。 对于模板中的{% load static%} 当在模板中使用过load static之后,再次使用static时,将会使用STATICFILES_FINDERS寻找静态文件,其默认值为: [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ] 对此的解释是,将会从STATICFILES_DIRS的目录中以及每个app下的static目录中寻找静态文件。 在url后加入+ static(settings.MEDIA_URL, document_root=settings....

February 25, 2021 · 1 min · 李昌

解决github每次push都要输入密码

记住账号密码 git config --global credential.helper store 然后再运行一遍git pull或git push就可以了 使用密钥验证(推荐) 参考主机上设置两个git账号

February 25, 2021 · 1 min · 李昌

鸭子类型

鸭子类型 1. 什么是鸭子类型 只要走起路来像鸭子,叫起来像鸭子,就可以认为是鸭子。这就是鸭子类型 2. 鸭子类型有什么作用? 对应于golang中的接口的概念,一个接口定义了一组操作,这组操作可以看做是鸭子的走路,叫。也就是说,只要任何类型满足了这组方法,那么就可以看做是鸭子–即满足了这个接口,可以看做是这个接口类型。

February 25, 2021 · 1 min · 李昌

考研

一切行动有规划 作为计算机专业的学生,我们要考的科目很多,遍历下来有政治、英语、高等数学、线性代数、概率论与数理统计、408计算机专业综合(数据结构、计算机组成原理、操作系统、计算机网络),如果没有一个详细的规划,不知道如何安排时间,就会感觉一团乱麻,总是感觉厚此薄彼或是毫无头绪。因此,我们需要一个合理的时间安排。首先是一个总的时间安排,即复习的进度安排,比如,要在9月之前完成一轮复习、11月之前完成二轮复习等。接下来,要根据进度安排,适当安排自己的每一天,这里所说的适当是指:按照你的能力和复习进度给自己一个在能力范围之内的目标值,并努力去完成它,但同时我们要给自己设定一个最低目标以鞭策自己。政治中说,我们要坚持底线思维,立足最低点,争取最大值,就是这个道理。 不浪费一分一秒 很明显,考研时间非常之紧张,我们一般是从3月左右开始复习,而此时的复习显然不能很快进入状态。因此,很多人的复习实际上是从暑假才真正开始,前面只能算是预热。从暑假开始,我们就要进入一个紧张的状态,每天基本只有三件事:看书、吃饭、睡觉。我告诉大家不要浪费一分一秒,不是让大家废寝忘食,不顾身体,每天做一个莫得感情的刷题机器,而是让大家珍惜学习时间中的每一分,每一秒。也就是说,你可以有适当的休息时间,暑假也可以适当回家玩玩,但是当你坐到书桌旁,就必须心无旁骛,专心学习。 一切目标为考研 考研的时候,你可能觉得有很多事想做,但是你要考虑到,做这件事对你的考研初试成绩提高有没有意义。这里之所以强调初试,是因为很多人觉得,这件事对复试很好,我可以提前做。其实不然,说句不好听的,还不一定能进复试呢。牢记自己的目标,将考研优先级提到最高,在考研期间,只有那些能提高你成绩的事做的才有意义,其他的事,先放一放罢。延迟享受。 适当休息 大家都说考研是一场持久战,事实如此。每天从早上到晚上坐在书桌旁,刚开始可能不觉得有什么,然后你会开始屁股疼,这时候一个坐垫就可以解决问题,再然后你会感到骨头仿佛生锈,脖子不舒服,这时候你需要一本颈复康指南,最后你会发现视力下降、发量减少,这时候你需要一瓶霸王。每周我们应该为自己安排一个休息时间,比如周日或周六,而且我建议,这个休息时间应放在上午,而不是下午或晚上。放在下午的话,我们可能休息的有点懒散,干脆晚上也不去了,这样就把晚上也浪费掉了,晚上的话,大家可能又玩的太嗨,导致第二天起不来,而放在上午,一是可以睡个懒觉,二是当你学习了一个下午加一个晚上后,晚上回到寝室,依然还跟以前的状态一样,感觉上就像学了一整天,可以充分保持自己的状态。坚持锻炼,身体是革命的本钱,没有良好的身体素质做支撑,如何能承受每天14个小时,全年无休的学习. 做题要做实 每做一题,应该做一个深入的思考,并拿笔记录下来,这并不是在浪费你的刷题时间,而是在节省你将来的复习时间。比如,我做完一题,我会给他评一个分数,后期还会指出其所考的知识点。之所以后期才指出知识点,是因为前期我对知识点的掌握还不全面不到位。我对题目的评分规则如下:(大家都知道,在Linux系统中有权限管理,比如一个文件,它对于文件所有者的权限可能是rwx,代表可读可写可执行,其中r为读,用数字1表示,w为写,用数字3表示,x为执行,用数字5表示,那么此文件对于另一个用户的权限为5,我们很容易就可推算出这个用户对这个文件只具有读和执行权限,不具有写权限。)[“第一次不会做”,“好题”,“难题”,“综合题”], 其中“第一次不会做”对应1,“好题”对应2,“难题”对应4,“综合题”对应8,这样的话,如果我对一个题目的评分为6(可以写作$=6或任何其他标志),那么就可以很容易得知,这个题比较好,并且比较难,但是我第一次可以做出来。当然,这四个评价完全可以换成任何其他评价,只要你觉得有用就好。知识点我会用[]来标注,比如某个题考了二维概率密度,那么就用红笔标注[二维概率密度]。你可以用你独特的方法来标注你做过的题目,来让自己以后的复习更加具有针对性。但是不要忘记,这些东西只是帮你记录一些东西,你需要自己动脑想一想,将这个题的出题目的,答题技巧,相似考题等都过一遍。最重要的还是自己的思考过程,不要被这些花里胡哨的东西迷花了眼。 知识要总结 学过的知识,要趁热打铁,对其进行有针对性的总结,将知识点,自己的理解等都记下来。不过不可能会说,那些知识点辅导书上都已经有了,我为什么要再写一遍,这不是浪费我时间嘛。我想告诉你的是,书上的是面向所有考生的,而你写下来,只是面对你自己。现在的东西都讲究个性化,我们也要给自己一个个性化定制的知识系统。总结不只是简单的把知识点抄下来,其中还包含这你对知识点的理解,甚至你还可以加上这个知识点的经典例题。不过,我见过很多人,知识点总结的很好,可惜到最后都没看,诸君要避免这个问题,不然不如省下时间背几个英语单词。 做错题要订正并牢记 考研复习,前期做加法,即不断增加自己的知识,后期做减法,即减少自己不会的,查漏补缺。那么我们怎么知道哪里有漏洞,哪里需要补呢?显然,错题可以帮我们快速定位,就好像一个错误的输出可以帮我们定位一个bug。题目做错,不一定是因为此处未掌握好,还有可能是题目太难、粗心做错,但无论是哪种问题,错题都是我们快速找到漏洞的最好办法。对待错题,我们最好有一个专门的错题本(找一个好点的本子,这样你丢也不舍得丢,写起来也舒服),将自己的错题摘抄到上面并写下错误原因与正确答案。后期错题本将派上大用场。 不畏难 不畏难,指不怕难题,不怕难学的知识点,任何知识点只要出现,就说明它完全在我们可理解的范围之内。不要让一个基本的知识点成为你的绊脚石,那就太蠢了。不会的可以向别人虚心请教,可以和同学或朋友约好,每周找个时间专门讨论这个星期遇到的硬骨头。 不浮躁 考研是十分枯燥乏味的,终日埋头苦学,没人说话,也没人管你,你需要调节自己的心理,不要心浮气躁。考研的时候大家一般都不带手机,有的人会带个耳机,带个MP3听个音乐。远离手机,从你做起。 不妄自菲薄 不管是考研前期、中期还是后期,总会听到一些“大神”的战绩。比如考研初,听说哪个哪个辅导书都二刷了,考研后期,听说哪个哪个数学真题做了好几个150。我想说,这些和你没关系,辅导书二刷的未必坚持到考试,可能中间就业签三方走人了(真实经历,当时听说辅导书二刷给我整蒙了,后来听说签三方又蒙了,真可谓是:懵逼树上懵逼果,懵逼果落砸死我),考150的大神有可能在吹牛,可能最后考试只考了100不到,可能还有的真大神,平时很厉害,一问啥都会,但是一到考试可能又不行了。说这些是想告诉大家,按照自己的计划,完成自己的预定目标就可以了。九阳真经中有一句话送给大家:他强任他强,清风拂山岗,他横任他横,明月照大江。 不自我膨胀 有的时候,可能是给某个同学解答了问题、可能是今天的英语阅读全对了、可能是今天的数学考了140,总之就是膨胀了。这时候一定要告诉自己,天外有天,人外有人,不能膨胀,一定是同学太菜、英语走了狗屎运、数学太简单,想办法打击一下自己。不能膨胀,但也要保持自信,我就是图书馆最靓的仔。 Q&A Q:专业课如何复习?(408) A:专业课一般从9月开始复习,前面可以稍微看看,但不要作为重点。专业课的特点是知识点多,需要在理解的基础上进行记忆。因此我们一定要打牢基础,首先将书本知识过一遍,在书本知识全部理解的基础上,再做辅导书上的习题。辅导书需要看很多遍,所以我们做的时候可以在其他地方比如草稿纸上写下答案,并将错题记录下来。专业课要想考的好,一定要多看几轮,复习的全面一点,408考4门课,每一门课都有很多知识点,搞不定就考到哪个知识点,我们只能尽量复习的全面。后期也要刷真题,最好多刷几遍。 Q:怎样才能看到一个学校的报录比之类的? A:每个学校可能不大一样,你可以去该校的研究生招生网看一看,或者去他们的考研群找一些学长问问。 Q:英语数学之类看的视频从哪找? A:可以从百度云、B站、公众号等处,甚至你还可以去Pornhub看考研视频。。。。 Q: 一定要报补习班或者跟着某个老师的教学视频学吗? A:不一定,因人而异,有的人喜欢看视频,觉得自己看书太慢,有的人看视频犯困,只喜欢自己慢慢啃(比如我)。补习班这个嘛,咱也没上过,咱也不知道。 Any problems?

January 15, 2020 · 1 min · 李昌