tonglin0325的个人主页

Linux学习笔记——Shell部分

1.shell命令

shell是连接linux内核和linux命令的模块

  命令名称  /bin/sh  /bin/csh  /bin/ksh

  chsh -s  输入新的shell,即修改shell

可以使用env命令查看当前的环境变量,可以查看当前使用的是什么shell命令

1
2
env | grep SHELL
SHELL=/bin/zsh

2.使用vi编辑器

键盘输入 功能
i 进入插入模式
esc 进入命令模式
w 将目前文件内容加以保存
q 退出,如果文件有修改会出现错误信息
q! 强制离开vi,并且不保存文件
wq 将修改过的内容保存,并离开vi
set nu 给文件中每一行添加行号
set nonu 取消行号
输入数字 直接输入数字再按esc,可将光标移至该行行首
/字符串 从头查找特定字符串
?字符串 从尾查找特定字符串

3.管道命令:pipe |

1.把一个命令的输出作为另一个命令的输入

1
2
ls -al /etc | less

4.选取命令:cut和grep

cut命令可以将一段消息的某段切出来。

-d接分隔符,-f是取出第几段的意思,-c是以字符串为单位取出固定的字符串范围

1
2
3
ls -F | grep '/' -v | cut -d'.' -f 1  #在取出不是文件夹的文件后,通过分隔符‘.’来分割,取出不包括文件后缀的文件名
ls -F | grep '/' -v | cut -c 1-  #取出第一个字符(包括第一个)之后范围的字符,也可以指定范围1-5

  

grep命令分析一行消息,如果其中有所需要的信息,就将该行取出。

1
2
3
4
5
ls -F | grep '/'  #取出文件夹的名字
ls -F | grep '/' -v  #反向,取出不是文件夹的文件
ls -l | grep ^d #只显示文件夹
ls -l | grep ^- #只显示文件

  

fgrep命令用于匹配文件内容

1
2
3
4
5
6
7
8
fgrep 'test' ./xxx.py
is_contain=`fgrep 'test' ./xxx.py`
if [ ! $is_contain ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi

  

5.排序命令:sort、wc和uniq

(a.txt保存的是ls -al的输出)

全文 >>

Ubuntu16.04安装Ranger2.1.0

1.编译ranger项目

1
2
3
4
5
git clone https://github.com/apache/ranger.git
cd ranger
git checkout -b release-ranger-2.1.0 release-ranger-2.1.0
mvn clean package -DskipTests -Drat.skip=true

需要注意的是,ranger2.1.0编译的时候,maven的版本需要大于3.6.0,否则会出现下面报错

1
2
3
4
5
6
7
8
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce (enforce-versions) on project ranger: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

编译成功

编译后可以看出target目录下的文件如下

全文 >>

机器学习——利用K-均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一簇中。它有点像全自动分类。聚类方法几乎可以应用到所有对象,簇内的对象越相似,聚类的效果越好。

K-均值(K-means)聚类算法,之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。

簇识别(cluster identification)给出簇类结果的含义。假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么。

全文 >>

机器学习——模型树

和回归树(在每个叶节点上使用各自的均值做预测)不同,模型树算法需要在每个叶节点上都构建出一个线性模型,这就是把叶节点设定为分段线性函数,这个所谓的分段线性(piecewise linear)是指模型由多个线性片段组成。

全文 >>

机器学习——回归树

**  线性回归创建模型需要拟合所有的样本点(局部加权线性回归除外)。当数据拥有众多特征并且特征之间关系十分复杂的时候,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生活中很多问题都是非线性**的,不可能使用全局限性模型来拟合任何数据。

  一种可行的方法是将数据集切分成很多份易建模的数据,然后再利用线性回归技术来建模。如果首次切分之后仍然难以拟合线性模型就继续切分。

  决策树是一种贪心算法,它要在给定时间内做出最佳选择,但是并不关心能否达到全局最优

全文 >>

系统设计——登录系统

1.认证方式

系统的常用的认证方式如下:账号密码(Basic Auth),OAuth2.0,SAML,OIDC,LDAP等

1.OAuth2.0 是一种授权协议,旨在允许应用程序安全访问资源,而不是用来验证用户的身份。

它通常用于授权流程,以获得对受保护资源的访问权限。不兼容oauth1.0.允许第三方应用代表用户获得访问权限。

可以作为web应用、桌面应用和手机等设备提供专门的认证流程。例如,用qq账号登录豆瓣、美团、大众点评;用支付宝账号登录淘宝、天猫等。参考:各开放平台账号登录API对接文档

2.SAML的全称是Security Assertion Markup Language, 是由OASIS制定的一套基于XML格式的开放标准,用在身份提供者(IdP)和服务提供者 (SP)之间交换身份验证和授权数据。

SAML的一个非常重要的应用就是基于Web的单点登录(SSO)。

3.OpenID Connect (OIDC) 是在 OAuth 2.0 的基础上构建的身份验证协议。

OIDC 添加了身份验证层,允许客户端验证用户的身份,并获取有关用户的附加信息。

还有其他的一些认证方式我们可以在Postman的authorization中查看

2.验证

1.人机校验

常用的人机校验有cloudflare,reCAPTCHA等

2.两步验证

二步验证、双重验证,简称2FA(Two-factor authentication)

3.Token

Token的类型

常用的Token种类有很多种,比如JWT(JSON web token),Bearer Token

1.JWT

一个通常你看到的jwt,由以下三部分组成,它们分别是:

  1. 全文 >>

特征预处理——特征缩放

特征缩放****(Feature Scaling)是一种将数据的不同变量或特征的方位进行标准化的方法。

在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲(数量级)的纯数值,便于不同单位或量级的指标能够进行比较和加权。

特征缩放的好处:

参考:标准化的好处及常见处理方法

  1. 提升模型的收敛速度

2.提升模型的精度

3.深度学习中数据归一化可以防止模型梯度爆炸。

需要特征缩放的模型:

参考:哪些机器学习模型需要归一化

概率模型(树形模型)不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF(随机森林)、朴素贝叶斯、XGBoost、lightGBM、GBDT

而像Adaboost、SVM(支持向量机)、LR(线性回归、逻辑回归)、KNN、KMeans、神经网络(DNN、CNN和RNN)、LSTM之类的最优化问题就需要归一化

特征缩放的方法:

常用的特征缩放的方法有归一化、标准化、正态化等。参考:2(1).数据预处理方法

选择建议:

参考:标准化和归一化什么区别?机器学习 | 数据缩放与转换方法(1)

1.特征是正态分布的,使用z-score标准化

2.特征不是正态分布的,可以尝试使用正态化幂变换

3.特征是正态分布的,如果有离群值,可以使用RobustScaler;没有离群值且是稀疏数据,可以使用归一化(如果数据标准差很小,min-max归一化会比z-score标准化好)

4.先划分训练集和测试集,然后再使用相同的标准化公式对训练集和测试集进行特征缩放

参考:数据的标准化数据预处理(一):标准化,中心化,正态化

1.归一化(scaler

1.min-max归一化

也叫离差标准化,是对原始数据的线性变换,将数据统一映射到**[0,1]区间**上,转换函数如下:

其中max为样本数据的最大值,min为样本数据的最小值。这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

min-max归一化的特点:

  • 缩放到0和1之间
  • 目的是使各个特征维度对目标函数的影响权重是一致的
  • 不改变其数据分布的一种线性特征变换

min-max归一化的适用场景:

  • 如果对输出结果范围有要求,用归一化
  • 如果数据较为稳定,不存在极端的最大最小值,用归一化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.preprocessing import MinMaxScaler

transfer = MinMaxScaler(feature_range=[0, 1]) # 范围可改变,若不写,默认为0-1
data_minmax = transfer.fit_transform(train_data[["SalePrice"]])
print(data_minmax)

[[0.24107763]
[0.20358284]
[0.26190807]
...
[0.321622 ]
[0.14890293]
[0.15636717]]

图片转自:https://www.zhihu.com/people/sun_shuai_

2.MaxAbs归一化

最大值绝对值标准化(MaxAbs)即根据最大值的绝对值进行标准化,假设原转换的数据为x,新数据为x’,那么x’=x/|max|,其中max为x所在列的最大值

MaxAbs归一化的特点:

  • MaxAbs方法跟Max-Min用法类似,也是将数据落入一定区间,但该方法的数据区间为[-1,1]
  • 不改变其数据分布的一种线性特征变换

MaxAbs归一化的适用场景:

  • MaxAbs也具有不破坏原有数据分布结构的特点,因此也可以用于稀疏数据、稀疏的CSR或CSC矩阵。
1
2
3
4
5
6
from sklearn.preprocessing import MaxAbsScaler

transfer = MaxAbsScaler()
data_minmax = transfer.fit_transform(train_data[["SalePrice"]])
print(data_minmax)

图片转自:https://www.zhihu.com/people/sun_shuai_

2.标准化(standardization

1.z-score标准化

也叫标准差标准化,经过处理的数据符合均值为0,标准差为1,其转化函数为:

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

z-score标准化的特点:

  • 假设数据是正态分布
  • 将数值范围缩放到0附近,数据变成均值为0,标准差为1的正态分布
  • 不改变原始数据的分布

z-score标准化的适用场景:

  • 这种标准化方法适合大多数类型的数据,也是很多工具的默认标准化方法。如果对数据无从下手可以直接使用标准化;
  • 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响
  • 需要使用距离来度量相似性的时候:比如k近邻、kmeans聚类、感知机和SVM,或者使用PCA降维的时候,标准化表现更好
  • Z-Score方法是一种中心化方法,会改变稀疏数据的结构,不适合用于对稀疏数据做处理。(稀疏数据是指绝大部分的数据都是0,仅有少部分数据为1)。在很多时候,数据集会存在稀疏性特征,表现为标准差小。并有很多元素的值为0.最常见的稀疏数据集是用来做协同过滤的数据集,绝大部分的数据都是0,仅有少部分数据为1。对稀疏数据做标准化,不能采用中心化的方式,否则会破坏稀疏数据的结构。参考:Python数据标准化

可以使用sklearn的StandardScaler函数对特征进行z-score标准化,注意fit_transform函数的输入需要时2D array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from sklearn.preprocessing import StandardScaler

# z-score标准化
transfer = StandardScaler()
data_standard=transfer.fit_transform(train_data[["SalePrice"]])
print(data_standard)

[[ 0.34727322]
[ 0.00728832]
[ 0.53615372]
...
[ 1.07761115]
[-0.48852299]
[-0.42084081]]

# 描述性统计
print(pd.DataFrame(data_standard).describe())

count 1.460000e+03
mean 1.362685e-16
std 1.000343e+00
min -1.838704e+00
25% -6.415162e-01
50% -2.256643e-01
75% 4.165294e-01
max 7.228819e+00

可以看到使用z-score标准化后的数据,均值接近0,标准差接近1

2.RobustScaler

RobustScaler的适用场景:

  • 某种情况下,假如数据集中有离群点,我们可以使用Z-Score进行标准化,但是标准化之后的数据并不理想,因为异常点的特征往往在标准化之后便容易失去离群特征。此时可以使用RobustScaler针对离群点做标准化处理,该方法对数据中心化和数据的缩放健壮性有更强的参数控制能力。
  • 如果要最大限度保留数据集中的异常,使用RobustScaler方法。

如果数据集包含较多的异常值,可以使用RobustScaler方法进行处理,它可以对数据集的中心和范围进行更具有鲁棒性的评估,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
from sklearn.preprocessing import RobustScaler

# Robust
transfer = RobustScaler()
data_robust = transfer.fit_transform(train_data[["SalePrice"]])
sns.distplot(pd.DataFrame(data_robust), fit=norm)
print(pd.DataFrame(data_robust).describe())
plt.show()

3.幂变换(Power Transform)

常用的幂变换包括:对数变换,box-cox变换,指数变换等,属于非线性变换

PowerTransformer 目前提供两个这样的幂变换,

全文 >>

特征预处理——特征选择和特征理解

1.数据可视化

1.单变量可视化

参考:从kaggle房价预测看探索性数据分析的一般规律

查看pandas某列的统计指标

1
2
3
4
5
6
7
8
9
10
11
12
13
# 描述性统计
print(train_data['SalePrice'].describe())

count 1460.000000  # 行数
mean 180921.195890  # 平均值
std 79442.502883  # 标准差
min 34900.000000  # 最小值
25% 129975.000000  # 第1四分位数,即第25百分位数
50% 163000.000000  # 第2四分位数,即第50百分位数
75% 214000.000000  # 第3四分位数,即第75百分位数
max 755000.000000  # 最大值
Name: SalePrice, dtype: float64

使用displot函数可以绘制直方图,bins越大,横坐标的精度越大

1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.displot(train_data['SalePrice'], bins=100)
plt.show()

可以看到数据呈现偏态分布

2.双变量关系可视化

使用scatterplot函数绘制散点图,查看2个数值型(numerical)变量的关系

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
import seaborn as sns

# 地上居住面积/房价散点图
sns.scatterplot(y=train_data['SalePrice'], x=train_data['GrLivArea'])
plt.show()
# 或者
data = pd.concat([train_data['SalePrice'], train_data['GrLivArea']], axis=1)
data.plot.scatter(x='GrLivArea', y='SalePrice', ylim=(0, 800000))
plt.show()

可以看出面积越大的房子,价格越高

使用stripplot函数绘制散点图,适用于某一变量的取值是有限的情况,查看1个数值型变量和1个标称型(categorical)变量之间的关系

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import seaborn as sns

# 房屋质量等级/房价散点图
sns.stripplot(x=train_data["OverallQual"] , y=train_data["SalePrice"])
plt.show()

可以看出质量等级越高的房子,价格越高

此外,对于标称值,也可以boxplot函数来绘制箱型图进行分析

1
2
3
4
5
6
7
import matplotlib.pyplot as plt 
import seaborn as sns

# 房屋质量等级/房价箱型图
sns.boxplot(x=train_data["OverallQual"], y=train_data["SalePrice"])
plt.show()

3.多变量关系可视化

参考:seaborn单变量/双变量/多变量绘图

可以使用pairplot函数来绘制多变量的散点图,来查看pandas数据集中每对变量之间的关系

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import seaborn as sns

cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(train_data[cols], height=1.5)
plt.show()

如果看一个应变量Y和多个自变量X之间的关系,可以指定Y轴的变量

1
2
3
4
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(train_data[cols], y_vars="SalePrice", height=1.5)
plt.show()

4.变量的分布

如果要添加正态分布曲线和原数据分布进行比较,可以使用distplot函数,该函数会给原数据添加拟合曲线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm

# 偏度和峰度
print("Skewness: %f" % train_data['SalePrice'].skew())
print("Kurtosis: %f" % train_data['SalePrice'].kurt())

# 绘制数据分布曲线
sns.distplot(train_data['SalePrice'], fit=norm)
# 绘制P-P曲线
fig = plt.figure()
stats.probplot(train_data['SalePrice'], plot=plt)
plt.show()

查看偏度和峰度

1
2
3
Skewness: 1.882876
Kurtosis: 6.536282

使用log函数对数据来取对数,从而进行数据归一化,参考:特征预处理——特征标准化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm

# 取log对数
train_data['SalePrice'] = np.log(train_data['SalePrice'])

# 偏度和峰度
print("Skewness: %f" % train_data['SalePrice'].skew())
print("Kurtosis: %f" % train_data['SalePrice'].kurt())

# 绘制数据分布曲线
sns.distplot(train_data['SalePrice'], fit=norm)
# 绘制P-P曲线
fig = plt.figure()
stats.probplot(train_data['SalePrice'], plot=plt)
plt.show()

使用log函数进行正则化后的分布曲线的偏度和峰度

1
2
3
Skewness: 0.121335
Kurtosis: 0.809532

2.特征选择

特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。

特征选择主要有两个功能:

  1. 减少特征数量、降维,使模型泛化能力更强,减少过拟合
  2. 增强对特征和特征值之间的理解

1.异常值处理

1.空值处理

如果一个特征有大量的空值,就可以考虑剔除该特征,比如当空值的比例大于15%的时候。

参考:特征预处理——异常值处理

2.离群值处理

全文 >>

机器学习——非均衡分类问题

在机器学习的分类问题中,我们都假设所有类别的分类代价是一样的。但是事实上,不同分类的代价是不一样的,比如我们通过一个用于检测患病的系统来检测马匹是否能继续存活,如果我们把能存活的马匹检测成患病,那么这匹马可能就会被执行安乐死;如果我们把不能存活的马匹检测成健康,那么就会继续喂养这匹马。一个代价是错杀一只昂贵的动物,一个代价是继续喂养,很明显这两个代价是不一样的

1.性能度量

衡量模型泛化能力的评价标准,就是性能度量。除了基于错误率来衡量分类器任务的成功程度的。错误率指的是在所有测试样例中错分的样例比例。但是,这样却掩盖了样例如何被错分的事实。在机器学习中,有一个普遍试用的称为混淆矩阵(confusion matrix)的工具,可以帮助人们更好地了解分类的错误。

利用混淆矩阵就可以更好地理解分类中的错误了。如果矩阵中的非对角元素均为0,就会得到一个完美的分类器

2.正确率(Precision)、召回率(Recall)

正确率P = TP/(TP+FP),给出的是预测为正例的样本中的真正正例的比例。

召回率R = TP/(TP+FN),给出的是预测为正例的真实正例所有真实正例的比例。

3.ROC曲线

另一个用于度量分类中的非均衡性的工具是ROC曲线(ROC curve),ROC代表接收者操作特征”Receiver Operating Characteristic”

ROC曲线的纵轴是“真正例率”,TPR=TP/(TP+FN)

横轴是“假正例率”,FPR=FP/(TN+FP)

在理想的情况下,最佳的分类器应该尽可能地处于左上角,这就意味着分类器在假正例率很低的同时,获得了很高的真正例率

4.AUC曲线下的面积)

对不同的ROC曲线进行比较的一个指标就是曲线下的面积(AUC),AUC给出的是分类器的平均性能值。一个完美的分类器的AUC是1,而随机猜测的AUC则为0.5。

若一个学习器的ROC曲线能把另一个学习器的ROC曲线完全包住,则这个学习器的性能比较好。

为什么要使用AUC曲线

因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。AUC对样本的比例变化有一定的容忍性。AUC的值通常在0.6-0.85之间。

全文 >>