qypx の blog

机会是留给有准备的人的.

参考
python文件编码说明 coding=utf-8 - 不笑猫 - 博客园
PEP 263 -- Defining Python Source Code Encodings | Python.org

在python 文件开头(一般是第一行或第二行),用来说明你的Python源程序文件用使用的编码。缺省情况下默认使用ascii编码,但如果在其中写中文的话,python解释器一般会报错,但如果加上你所用的文件编码,python就会自动处理不再报错。

通常写法:

1
2
#!/usr/bin/python
# -*- coding: <encoding name> -*-

或:

1
# coding=<encoding name>

More precisely, the first or second line must match the following regular expression:

1
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

例如:

1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-

参考
环境变量——关于PATH与CLASSPATH的区别(作用)
path与classpath区别

1. Path

PATH是系统用来指定可执行文件的完整路径。

当在cmd中执行命令时,如果执行的可执行文件不在当前目录下,那么系统就会依次搜索PATH中设置的路径。例如,若在PATH中设置了python的安装目录(D:.3),那么就可以在任意路径下使用python xxx.py执行python程序,而不必在CMD中切换到python的安装目录下运行该命令。

2. classpath

CLASSPATH是指定程序中所使用的类文件所在的位置。classpath是java专用的查找类的路径。一般只在配置java环境时会用到。

3. 用户变量与系统变量

用户变量只对当前用户有效;系统变量对所有用户有效。对于当前用户而言,设置用户变量与系统变量的效果大致相同,只是系统变量的路径排在用户变量的路径之前。

小结:一般安装软件时环境变量的配置,编辑系统变量下的path内容即可。

参考:
https://blog.csdn.net/Alian_W/article/details/105131376
https://www.jianshu.com/p/98f7e34845b5

1. 位置参数 (Positional)

位置参数顾名思义就是与位置有关的参数,在调用函数的时候需要根据传入参数的位置来一一对应参数。并且,位置参数是不可缺省的,即不传入完整的参数是会报错的。位置参数是最为常见的一种参数,例如:

1
2
3
4
def add(num1, num2):
return num1 + num2

add(1,2)

add 函数的两个参数即为位置参数,调用时第几个位置传入,则对应函数定义中该位置的参数。

小结:位置参数就是与函数参数位置有关的参数,且函数的位置参数不可缺省,必须传满

2. 默认参数 (Default)

默认参数顾名思义就是与默认值有关的参数,为了增加函数的鲁棒性,也为了传参时在可以使用默认设置的情况下不用传那么多参数,参数可以设置默认值,这样即使缺省了该参数也不会报错。例如:

1
2
3
4
def minus(num1, num2=0):
return num1 - num2

minus(1) #1传给num1,此时num2缺省不会报错

注意:定义函数时默认参数一定要在位置参数之后。其实很好理解,若默认参数可以放在位置参数之前,那当传参的个数少于参数个数,解释器到底是将参数给位置参数还是给默认参数?如下所示:

1
2
3
4
5
6
7
def minus2(num1=1, num2):
return num1 - num2
# 定义时会报错:SyntaxError: non-default argument follows default argument

# 若给num1,则num2缺省了,不就报错了?
# 若给num2,我怎么知道你是不是要给num1赋值?
minus2(1)

小结:默认参数就是需要设置默认值的参数,默认参数必须放在位置参数之后,当需要使用默认值时可以不传默认参数

阅读全文 »

假设安装anaconda时选择的python版本为Python3.8,又新创建了虚拟环境python36(python版本选择的Python3.6),如何在命令行中使用不同版本的python:

由于环境变量中加入了anaconda的路径,此时直接在命令行中运行python时,默认使用的是anaconda.exe所对应的版本(即Python3.8)。

1
2
>python --version
Python 3.8.5

如何使用Python3.6:

首先cd到对应的虚拟环境的python.exe路径下,此时执行python命令时便使用的相应版本:

1
2
3
4
>cd d:\anaconda\anaconda\envs\python36
>python --version
Python 3.6.12 :: Anaconda, Inc.

参考
WOE与IV值浅谈
机器学习-变量筛选之IV值和WOE

0. Introduction

WOE (weight of evidence): 证据权重

IV (information value): 信息值

计算WOE与IV值的意义:

(1)用woe编码可以处理缺失值问题。

(2)IV值可以衡量各变量对 y 的预测能力,用于筛选变量,IV值越大,表示该变量的预测能力越强。

(3)对离散型变量,woe可以观察各个level间的跳转对odds的提升是否呈线性,而IV可以衡量变量整体(而不是每个level)的预测能力。

(4)对连续型变量,woe和IV值为分箱的合理性提供了一定的依据。

阅读全文 »

map、apply、applymap

Pandas教程 | 数据处理三板斧——map、apply、applymap详解 - 知乎

在日常的数据处理中,经常会对一个DataFrame进行逐行、逐列和逐元素的操作,对应这些操作,Pandas中的mapapplyapplymap可以解决绝大部分这样的数据处理需求。

生成100行示例数据:

1
2
3
4
5
6
7
8
9
10
11
12
boolean=[True,False]
gender=["男","女"]
color=["white","black","yellow"]
data=pd.DataFrame({
"height":np.random.randint(150,190,100),
"weight":np.random.randint(40,90,100),
"smoker":[boolean[x] for x in np.random.randint(0,2,100)],
"gender":[gender[x] for x in np.random.randint(0,2,100)],
"age":np.random.randint(15,90,100),
"color":[color[x] for x in np.random.randint(0,len(color),100) ]
}
)

image-20210717144622753

Series数据处理
1. map用法

若想把数据集中gender列的男替换为1,女替换为0,可使用 Series.map()

1
2
3
4
5
6
7
8
9
# 法一:使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})

# 法二:使用函数
def gender_map(x):
gender = 1 if x == "男" else 0
return gender
# 注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)

不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。

注:若该列中存在map字典中不存在的值,例如,gender 中还存在“未知”,则“未知”会被映射为Nan,此时可选择使用函数进行映射,定义一个else,同时使用函数会更加灵活,例如当满足多个条件时,都映射到某个值

阅读全文 »

Odds And Log Odds In Logistic Regression
WHAT and WHY of Log Odds. WHAT are Log Odds and WHY are they… | by Piyush Agarwal | Towards Data Science
Logit究竟是个啥?——离散选择模型之三

1. probability, odds 与 log odds

(1)probability 是某件事与所有可能发生的事的比率。(p)

(2)odds 是某件事发生和某件事没有发生的比率。

\[ odds = \frac{p}{1-p} \] (3)log odds 即对odds取对数, log(odds)

例如我与人工智能(AI)系统下了10局棋,并有4次能够打败它:

Probability of winning: 4/10 = 0.40

Odds of winning: 4/6 = 0.6666

log(Odds of winning) = log(0.6666) = -0.176

从(1)到(3),就是 Logit 变换。

2. logistic regression

p 与 logodds 的相互转换关系 \[ p = \frac{1}{1+e^{-(\beta_0+\beta_1x)}}\quad\quad(1) \]

则有,

\[ 1-p = \frac{e^{-(\beta_0+\beta_1x)}}{1+e^{-(\beta_0+\beta_1x)}} \]

\[ odds=\frac{p}{1-p}=e^{\beta_0+\beta_1x} \]

\[ log odds = ln(\frac{p}{1-p})=\beta_0+\beta_1x \quad \quad (2) \]

带入(1)中,可得 \[ p=\frac{1}{1+e^{-logodds}}=\frac{e^{logodds}}{1+e^{logodds}} \quad \quad (3) \]

3. logodds 与 sigmoid

\[ logodds操作:logodds(p) = log(\frac{p}{1-p}) \]

\[ sigmoid function: sigmoid(x) = \frac{1}{1+e^{-x}} \]

\[ p=\frac{1}{1+e^{-(\beta_0+\beta_1x)}},其中\beta_0+\beta_1x为原始输出,即sigmoid作用在原始输出上得到概率值 \]

\[ logodds = ln(\frac{p}{1-p})=\beta_0+\beta_1x,即logodds作用在概率值上得到原始输出 \]

一句话概括:sigmoid与logodds为相反操作。

logodds 就是 logit。Odds 的对数称之为 logit。从概率 P → Odds → Logit,这就是一个 Logit 变化。

4. xgboost与lightgbm的几种输出结果

对于xgboost:

1
2
3
model.predict(,output_margin=True)  #原始值(output the raw untransformed margin value)(每个样本在xgboost生成的所有树中叶子节点的累加值)
model.predict_proba()[:,1] # 取1的概率
model.predict() # 结果为0,1

对于lightgbm:

1
2
3
model.predict(,raw_score=True)  # 原始值
model.predict_proba()[:,1] # 取1的概率
model.predict() # 结果为0,1

参考 Find most frequent element in a list in Python (tutorialspoint.com)

1. 法一:with max and count

1
2
3
4
5
6
# Given list
listA = [45, 20, 11, 50, 17, 45, 50,13, 45]

res = max(set(listA), key = listA.count)
print("Element with highest frequency:\n",res)
# 输出 45

2. 法二:with Counter

1
2
3
4
5
6
7
8
9
from collections import Counter

# Given list
listA = [45, 20, 11, 50, 17, 45, 50,13, 45]

occurence_count = Counter(listA)
res=occurence_count.most_common(1)[0][0]
print("Element with highest frequency:\n",res)
# 输出 45

3. 法三:with mode

返回众数

1
2
3
4
5
6
7
from statistics import mode
# Given list
listA = [45, 20, 11, 50, 17, 45, 50,13, 45]

res=mode(listA)
print("Element with highest frequency:\n",res)
# 输出 45

补充:关于 Counter

将一个 list 传入 Counter,将返回一个包含每个元素出现次数的字典

1
2
3
4
5
6
7
8
9
10
from collections import Counter

# Given list
listA = [45, 20, 11, 50, 17, 45, 50,13, 45]

occurence_count = Counter(listA)
occurence_count.keys()
# dict_keys([45, 20, 11, 50, 17, 13])
occurence_count.values()
dict_values([3, 1, 1, 2, 1, 1])

most_common([n])方法:

返回前n个出现次数最多的元素及其数量。 如果省略n或None,将返回计数器中的所有元素。 具有相同计数的元素可以任意排序

1
2
3
4
5
occurence_count.most_common(1)
# [(45, 3)]

occurence_count.most_common(2)
#[(45, 3), (50, 2)]

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

参考
Chi-Square Test vs. t-Test: What's the Difference? - Statology
Chi-Square Test | How to Calculate Chi-square using Formula with Example (byjus.com) ⬅可查看卡方表

1. 卡方检验

实际上卡方检验有几种不同的版本,但最常见的是卡方独立性检验(Chi-Square Test of Independence)。

1.1 定义

当我们想要检验两个分类变量之间是否存在统计上显着的关联时,我们使用卡方独立性检验。

原假设(\(H_0\)): 两个变量之间没有显著的关联。 备择假设(\(H_a\)): 两个变量之间有显著的关联。

即:拒绝原假设,表示两个变量之间有显著的关联

1.2 案例

以下是可能用到卡方独立性检验的一些例子。

(1)案例1: 我们想知道性别(男性、女性)和政党偏好(共和党、民主党、独立党派)之间是否有统计学上的显著关联。为了验证这一点,我们可以随机调查100个人,记录他们的性别和政党偏好。然后,我们可以对独立性进行卡方检验,以确定性别和政党偏好之间是否有统计学上的显著关联。

(2)案例2: 我们想知道年级(大一、大二、大三、大四)和最喜欢的电影类型(惊悚片、戏剧、西部片)之间是否有统计学上的显著关联。为了验证这一点,我们可以随机调查某所学校每个年级的100名学生,并记录下他们最喜欢的电影类型。然后,我们可以对独立性进行卡方检验,以确定年级和喜爱的电影类型之间是否有统计学意义上的关联。

(3)案例3: 我们想知道一个人最喜欢的运动(篮球、棒球、足球)和他们成长的地方(城市、农村)之间是否有统计学上的显著关联。为了验证这一点,我们可以随机调查100个人,问他们在什么样的地方长大,他们最喜欢的运动是什么。然后,我们可以对独立性进行卡方检验,以确定一个人最喜欢的运动和他们成长的地方之间是否有统计学上的显著关联

1.3 假设

在对独立性进行卡方检验之前,我们首先需要确保满足以下假设,以确保检验有效

  • 随机:应该使用随机样本或随机实验来收集两个样本的数据。
  • 分类型:我们正在研究的变量应该是分类型的。
  • 样本量 :变量的每个取值的预期观察数应至少为5。

1.4 如何计算

参考 https://www.statology.org/chi-square-test-of-independence/

\[ \chi^2=\frac{\sum(O-E)^2}{E} \]

where: \(O:\) observed value \(E:\) expected value

If the p-value that corresponds to the test statistic X2 with (#rows-1)*(#columns-1) degrees of freedom is less than your chosen significance level then you can reject the null hypothesis.

假设我们想知道性别是否与政党偏好有关。我们随机抽取500名选民,调查他们的政党偏好。下表显示了调查结果:

接下来,我们将用下面的公式计算列联表中每个单元格的期望值 \[ Expected\ value = (row\ sum * column\ sum) / table\ sum. \] For example, the expected value for Male Republicans is: \((230*250) / 500 = 115\)​. We can repeat this formula to obtain the expected value for each cell in the table:

下一步,对每个单元格计算\((O-E)^2/E\) For example, Male Republicans would have a value of: \((120-115)^2 /115 = 0.2174\). We can repeat this formula for each cell in the table:

计算检验统计量 \(\chi^2\) 和相应的p值:

\(\chi^2 = Σ(O-E)^2 / E = 0.2174 + 0.2174 + 0.0676 + 0.0676 + 0.1471 + 0.1471 =0.8642\)

According to the Chi-Square Score to P Value Calculator, the p-value associated with \(\chi^2\) = 0.8642 and (2-1)*(3-1) = 2 degrees of freedom is 0.649198. 由于这个p值不小于0.05,我们无法拒绝零假设。这意味着我们没有足够的证据表明性别和政党偏好之间存在联系。

Note : You can also perform this entire test by simply using the Chi-Square Test of Independence Calculator.

阅读全文 »
0%