周学习笔记(2021.7.26-2021.8.1)
文章目录
- 周学习笔记(2021.7.26-2021.8.1)
- 7.26
- 7.27
- 7.28
- 1. 业务逻辑
- 2.绝对路径 & 相对路径
- 3. os.getcwd()
- 4. pd.read_csv() & pd.read_table()
- 5. pd.read_csv()参数
- 6. to_csv
- 7. 删除 dataframe 列的方式
- 8. pd.DataFrame
- 9. sort_index() & sort_values()
- 10. np.arange() & range()
- 11. dropna() & fillna()
- 12. 检索空缺值
- 13. 数据中的重复值
- 14. 特征处理说明
- 15. qcut() & cut()
- 16. unique() & nunique()
- 17. get_dummies() 中的prefix参数
- 18. map & zip
- 19. concat() & append() & join() &merge()
- 20. stack()
- 21. groupby() & agg()
- 22. 可视化
- 7.29
- 7.30
- 7.31
- 8.1
7.26
1. typora快捷键
ctrl+shift+i 插入图片
7.27
1. drop_duplicates()
两种情况,完全重复的行、部分列重复的行
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
代码中subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。默认值为subset=None表示考虑所有列。
keep='first’表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,分别表示保留最后一次出现的重复行和去除所有重复行。
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
2. data & datatime模块
常见的时间表示形式:时间戳、格式化的时间字符串
datatime.date(year,month,day) 构造函数
3. sns.boxplot()
orient 用于控制图像是水平还是竖直显示,v竖直显示,h水平显示
4. dropna()
df=df.dropna()#删除所有包含NaN的行,相当于参数全部默认
#df=df.dropna(axis=0,how=‘any’,thresh=None,subset=None,inplace=False)
5.机器学习中的评估穿越
6. 学习曲线 & 验证曲线
摘自《阿里云天池大赛赛题解析——机器学习篇》
学习曲线:通过画出不同大小的训练集和交叉验证的准确率,观察模型在新数据上的表现,进而来判断模型是否存在方差过高或偏差过高,以及增大训练集是否可以减小过拟合
验证曲线:横轴为某个超参数的一系列值,由此来看不同参数设置下的准确率,进而看到随着超参数设置的改变,模型从欠拟合到合适再到过拟合的过程
7. 特征选择 & 特征降维
7.28
1. 业务逻辑
三层开发就是将系统的整个业务应用划分为表示层,业务逻辑层和数据访问层,这样有利于系统的开发、维护、部署和扩展
实现核心功能的代码称为业务逻辑
2.绝对路径 & 相对路径
在把绝对路径转化为相对路径的时候,两个文件绝对路径中相同的部分都可以忽略,不做考虑
使用“…/”来表示上一级目录,“…/…/”表示上上级的目录,以此类推
3. os.getcwd()
import os
print(os.getcwd()) #返回当前工作的目录
4. pd.read_csv() & pd.read_table()
(1)read_csv() 默认逗号切割数据集
(2)read_table() 所有属性之间用逗号分隔,且只有一列;默认制表符切割数据集’\t’
tsv(tab-separated values) csv(comma-separated values)
可以通过在函数中设定sep参数的值,使输出结果相同
5. pd.read_csv()参数
用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None
如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名
用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
6. to_csv
如果保存下来有乱码,可以尝试设定编码方式
如
df.to_csv('',encoding='GBK')
df.to_csv('',encoding='utf-8')
7. 删除 dataframe 列的方式
(1)drop() 对行、列均可以操作
(2)del() 仅对列操作,且一次只能删除一列,不能删除多列
# 使用del, 一次只能删除一列,不能一次删除多列
# 只能使用 del df['密度'], 不能使用 del df[['密度', '含糖率']]
del df['密度']
# del df[['密度', '含糖率']] 报错
# 使用drop,有三种方法:
dt = dt.drop(['密度', '含糖率'], axis=1) # axis=1 表示删除列,['密度', '含糖率'] 要删除的col的列表,可一次删除多列
dt.drop(['密度', '含糖率'], axis=1, inplace=True) # inplace=True, 直接从内部删除
dt.drop(dt.columns[[0, 4, 8]], axis=1, inplace=True) # dt.columns[[0, 4, 8]] 直接使用索引查找列
8. pd.DataFrame
data类型是字典,键作为列名,值可以是列表,也可以是array数组,series类型
df=pd.DataFrame(data)
9. sort_index() & sort_values()
直接对数据排序,不会产生一个新的数据,因此不需要将它赋给一个新的变量
sort_index() 按照行索引进行排序
sort_values() 多一个by参数,对具体列进行索引
10. np.arange() & range()
前者步长间隔可以为浮点数,而后者只能是整数
(1)range(start,end,step)
如果省略step
参数,则默认为1。如果省略start
参数,则默认为0。得到一个整数列表
(2)arange(start,end,step)
返回array对象
11. dropna() & fillna()
记得之前笔记里有些,害,总不用就是爱忘
(1)dropna()
DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)
参数:
axis: 默认axis=0。0为按行删除,1为按列删除
how: 默认 ‘any’。 ‘any’指带缺失值的所有行/列;'all’指清除一整行/列都是缺失值的行/列
thresh: int,保留含有int个非nan值的行
subset: 删除特定列中包含缺失值的行或列
inplace: 默认False,即筛选后的数据存为副本,True表示直接在原数据上更改
(2)fillna()
参数
method
{‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None
pad/ffill:用前一个非缺失值去填充该缺失值
backfill/bfill:用下一个非缺失值填充该缺失值
None:指定一个值去替换缺失值(缺省默认这种方式)
inplace——True/False 是否替换
可以直接传入一个固定值,即所有空缺处均填充该值;也可以传入一个字典,键对应列名,值对应该列空缺填充的值
12. 检索空缺值
数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan
df[df['Age']==None]
df[df['Age'].isnull()]
df[df['Age']==np.nan]
13. 数据中的重复值
# 说明duplicated()是对整行进行查重,return 重复了的数据,且只现实n-1条重复的数据(n是重复的次数)
df[df.duplicated() == True]
# 留下了完全唯一的数据行(实现去重)
df.drop_duplicates()
14. 特征处理说明
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。
文本型特征往往需要转换成数值型特征才能用于建模分析
15. qcut() & cut()
发现上周的笔记中记了这条,但是当时参数整理的不全
两者都返回分箱后对应的组号,列表形式
cut() 等距分箱 qcut 等频分箱
#平均分五个年龄段
df['AgeBand'] = pd.qcut(df['Age'], 5,labels = [1,2,3,4,5])
#按照指定区间划分
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
#原要求:将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
#即在等频上变化
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
16. unique() & nunique()
前者类别,后者对应数量
17. get_dummies() 中的prefix参数
prefix设置前缀,一般都为column名_数值
18. map & zip
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
zip
19. concat() & append() & join() &merge()
axis 默认参数为0 ,横着对接,同append()
参数为0,竖着对接,同join()
merge() 类似于数据库中的连接
20. stack()
21. groupby() & agg()
groupby() 基于行的聚合函数
survived_pclass = text['Survived'].groupby(text['Pclass'])
注意groupby参数中不是该属性,而是Series数据
text.groupby(['Pclass','Age'])['Fare'].mean()
agg()是基于列的聚合函数
text.groupby('Sex').agg({'Fare': 'mean', 'Pclass': 'count'}).rename(columns={'Fare': 'mean_fare', 'Pclass': 'count_pclass'})
22. 可视化
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='False')
plt.title('survived_count')
plt.ylabel('count')
7.29
1. train_test_split
sklearn.model_selection包中 (这个包里还有cross_val_score)
X_train,X_test,y_train,y_test=train_test_split(train_data,train_target,test_size=0.4,random_state=1,stratify=train_dada/train_target)
注:一般将验证集命名为X_test,y_test
train_data 所要划分的样本特征集
train_target 所要划分的样本结果
test_size 如果为整数,则表示训练集数量;小数则表示划分比例
random_state 随机种子(填0或者不填 都是一样的
stratify 按照前类数据分布 划分的训练集和测试集均是
2. predict & predict_proba
一般监督模型在sklearn里面有个predict
能输出预测标签,predict_proba
则可以输出标签概率
3. cross_val_score
sklearn.model_selection.cross_val_score(estimator,X_train,y_train,scoring,cv,n_jobs,verbose,)
其中scoring是评价指标
cv 交叉验证次数
该函数返回的是每一折得分,共cv折
【k的取值】
k=1是完全不使用交叉验证,即全部数据均参加训练,过拟合导致低偏差高方差
留一法是k的另一个极端,单一模型评估时的方差逐渐增大
k=log(n) 且n/k>3d n表示数据量,k表示特征数
4. 模型评估相应包
(1)混淆矩阵
from sklearn.metrics import comfusion_matrix
comfusion_matrix(y_train,pred)
(2)精确率、召回率、f1值
from sklearn.metrics import classification_report
classification_report(y_train, pred)
精确率(查准率):真正正确的占预测为正的概率
召回率(查全率):真正正确的占所有实际为正的概率
f1值
2
(
P
r
e
c
i
s
i
o
n
⋅
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
)
2(\frac{Precision·Recall}{Precision+Recall})
2(Precision+RecallPrecision⋅Recall)
Macro-f1 & Micro-f1
(3)ROC曲线
函数有三个返回值,fpr,tpr,thresholds [ˈθreʃhəʊld] 阈值
from sklearn.metrics import roc_curve
fpr,tpr,thresholds=roc_curve(y_true,y_score,pos_lable)
pos_label=2 是指在y中标签为2的是标准阳性标签,其余值是阴性。
拓:定义模型、训练、预测
lr=LogisticRegression()
lr.fit(X_train,y_train)
lr.predict(X_train)
5. decision_function()
与SVM有关
用来衡量待预测样本到分类模型各个分隔超平面的距离
6. matplotlib可视化学习
axis 轴 axes轴(复数)
(1)hist直方图
bins=np.arange(0,101,10)
plt.hist(x,bins,density,alpha)
plt.xlabel('')
plt.ylabel('')
x表示数据集;bins划分区间,可以是数组,也可以是int类型,即划分组数
density bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致
alpha 透明度 0完全看不到
(2)bar柱状图
plt.bar(left,height,alpha,width,color,)
width 柱子宽度
(3) pie饼图
plt.pie()
plt.xlabel('',fontsize=)
plt.ylabel('',)
plt.title()
set_xticks([])
set_sticklabels([],rotation=)
set_title()
7.30
1. 向量的转置
一般的书籍都是横版印刷,所以列向量的表示形式是在行向量的右上角添加一个字母"T",表示转置
2. latex公式
3. 散点图
import seaborn as sns
sns.scatterplot(x,y,color=,alpha=0.6)
plt.title('')
plt.show()
plt.scatter(x,y,)
4. fit & fit_transform
fit() 求得训练集x均值、方差、最大值,这些训练集x固有的属性
transform() 在fit基础上,进行标准化、降维、归一化等操作
fit_transform 既训练又转换
如果fit_transfrom(trainData)后,使用fit_transform(testData)而不transform(testData),虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异
5. CountVectorizer
是一种文本特征提取方法,对于每一个训练文本,他只考虑每种词汇在该训练文本中出现的频率
根据输入数据获取词频矩阵(稀疏矩阵)
CountVectorizer(max_features=)
max_features 默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集
6. 多项式回归
sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order=‘C’):
- 参数:
degree:特征转换的阶数。
interaction_onlyboolean:是否只包含交互项,默认False 。
include_bias:是否包含截距项,默认True。
order:str in {‘C’, ‘F’}, default ‘C’,输出数组的顺序。
7. 模型的偏差和方差
参考:Datawhale ensemble-learning 组队学习
所谓模型的方差就是:用不同的数据集去估计𝑓f时,估计函数的改变量
模型的复杂度越高,其方差也越大,但偏差会减小
模型的偏差是指:为了选择一个简单的模型去估计真实函数所带入的误差
偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
偏差度量的是单个模型的学习能力,而方差度量的是同一个模型在不同数据集上的稳定性
8. 特征选择
(1)最优子集选择
(2)向前逐步选择
9. SVM & SVR & SVC
- SVM=Support Vector Machine 是支持向量 机
- SVC=Support Vector Classification就是支持向量机用于 分类,
- SVR=Support Vector Regression.就是支持向量机用于 回归分析
10. RepeatedStratifiedKFold()
每一次重复是不同的
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_splits需要能被样本整除
11. 模型融合
参考:Datawhale ensemble-learning 组队学习
(1)Voting
回归投票:预测结果是所有预测结果的平均值
分类投票:硬投票 & 软投票
硬投票:最多出现的类
软投票:将各个分类器得到的概率值相加取平均得到对应类的概率,概率值大的类为预测结果
【代码】
所有分类器放在model列表中,每一个分类器是一个元组,分别是命名字符串,对应模型
注意命名不能重复
models = [('lr',LogisticRegression()),('svm',SVC())]
ensemble = VotingClassifier(estimators=models,voting='soft')
(2)Bagging
Bagging思想的实质是:通过Bootstrap 的方式对全样本数据集进行抽样得到抽样子集,对不同的子集使用同一种基本模型进行拟合,然后投票(voting)得出最终的预测
Bagging主要通过降低方差的方式减少预测误差——>放回抽样
【代码】
sklearn为我们提供了BaggingRegressor 与 BaggingClassifier 两种Bagging方法的API
两种方法的默认基模型是树模型
(3)Boosting——串行,增加计算复杂度
Boosting方法是使用同一组数据集进行反复学习,得到一系列简单模型,然后组合这些模型构成一个预测性能十分强大的机器学习模型
Boosting主要通过降低偏差的方式减少预测误差
【重点关注两个问题】
每一轮学习应该如何改变数据的概率分布
如何将各个弱分类器组合起来
【Adaboost】
第一个问题解答:提高那些被前一轮分类器错误分类的样本的权重,而降低那些被正确分类的样本的权重
第二个问题解答:各个弱分类器的组合是通过采取加权多数表决的方式,具体来说,加大分类错误率低的弱分类器的权重,因为这些分类器能更好地完成分类任务,而减小分类错误率较大的弱分类器的权重,使其在表决中起较小的作用
整个过程
首先每个样本的权重相同(没有先验信息的条件下每个样本在基本分类器的学习中一样),确定基分类器,计算分类误差率
分类误差率——>确定基分类器的权重——>计算每个样本的权重
最后构建基础分类器的线性组合,即得到最终的分类器
所有的基分类器权重之和不为1。𝑓(𝑥)f(x)的符号决定了样本x属于哪一类
问:每一次的基分类器如何确定?
阈值v由该基本分类器在训练数据集上分类错误率最低确定。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
ada=AdaBoostClassifier(base_estimator,n_estimators,learning_rate,algorithm,random_state)
ada=ada.fit(X_train,y_train)
y_pred=ada.predict(X_test)
ada_test=accuracy_score(y_test,y_pred)
base_estimator 基本分类器 默认?
n_estimators 终止迭代次数
learning_rate 学习率
algorithm 默认?
random_state 随机种子
【GBDT】
回归问题,不能再使用信息增益、信息增益比、基尼系数等指标,因为是连续型数值,我们使用平方误差
在Adaboost算法中使用分类错误率修正样本权重以及计算每个基模型的权重,回归问题中用每个样本的残差表示每次使用基函数预测时没有解决的那部分问题(一句话点到位,tql)
过程
针对每一个切分点计算m(s), 某一切分点处m(s)取得最小值,计算残差,逐渐拟合残差
7.31
1. pd.read_csv()中的parse_datas参数
将哪一列解析为时间索引
2. pd.concat()
axis=0 按照行进行拼接;axis=1 按照列进行拼接
ignore_index=True 忽略原来的序列,连接后再重新赋序号
3. reset_index()
获得新的index,原来的index变成数据列,保留下来
不想保留原来的index,使用参数 drop=True,默认 False
4. data.loc
data.loc[data['age']<0,'age']=20
5. np.column_stack()
将两个矩阵按列合并
6. StratifiedKFold()
validation 验证
from sklearn.model_selection import StratifiedKFold
folds=StratifiedKFold(n_splits=5,shuffle=True,random_state=5)
for fold_,(trn_index,val_index) in enumerate(folds.split(X_train,y_train)):
返回的是序列,而不是原来的数
7. pandas显示所有行、列
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',100)
8. pd.columns & pd.columns.tolist
col = df.columns #可以获得列名和元素类型,但无法直接操作
col=df.columns.tolist() #获得dataframe列名列表
9. 网格搜索两种代码
参考:datawhale ensemble-learning 组队学习
Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)
print("Size of training set:{} size of testing set:{}".format(X_train.shape[0],X_test.shape[0]))
#### 1
best_score = 0
for gamma in [0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm = SVC(gamma=gamma,C=C)#对于每种参数可能的组合,进行一次训练;
svm.fit(X_train,y_train)
score = svm.score(X_test,y_test)
if score > best_score:#找到表现最好的参数
best_score = score
best_parameters = {'gamma':gamma,'C':C}
print("Best score:{:.2f}".format(best_score))
#### 2
from sklearn.model_selection import GridSearchCV
#把要调整的参数以及其候选值 列出来;
param_grid = {"gamma":[0.001,0.01,0.1,1,10,100],
"C":[0.001,0.01,0.1,1,10,100]}
print("Parameters:{}".format(param_grid))
grid_search = GridSearchCV(SVC(),param_grid,cv=5) #实例化一个GridSearchCV类,cv交叉验证参数
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=10)
grid_search.fit(X_train,y_train) #训练,找到最优的参数,同时使用最优的参数实例化一个新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))
print("Best parameters:{}".format(grid_search.best_params_))
#SVM模型有两个非常重要的参数C与gamma。
#C是惩罚系数,即对误差的容忍度(间隔大小,分类准确度)。C越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
#gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
#两者独立
10. 核密度估计图
g=sns.kdeplot(data_all[(data_all["oringin"]=='train')][column],color="Red",shade=True)
索引的数据,先检索符合条件的行,整合后再提取列
11.np.zeros_like()
新创建的矩阵维度同传入的参数,且元素均为0
12. apply()
至于传入的函数具体是对每一行还是每一列进行操作,取决于apply传入的axis参数,默认axis=0,表示对每一列进行操作,axis=1,表示对每一行进行操作。因此apply方法最重要的两个参数是传入的函数func和axis
注:axis=0代表往跨行(down),从上向下
而axis=1代表跨列(across) ,从左到右
13. make_scorer()
sklearn.metrics.make_scorer(score_func,greater_is_better)
score_func 一个可调用的记分函数,两大类,以_score和_error结尾
greater_is_better 输入的score_func为记分函数时,该值为True(默认值);输入函数为损失函数时,该值为False;在后面这种情况中,得到的对象会对结果进行翻转,因为损失函数意味着函数值越小,拟合情况越好
14. 离群点 & 噪声
观测量=真实数据+噪声
噪声是一个观测量的随机错误或偏差,包括错误的值,偏离期望的孤立点
离群点属于观测量,有些是合理的,有些则是噪声
15. 3 sigma原则
3σ原则,又叫拉依达原则,它是指假设一组检测数据中只含有随机误差,需要对其进行计算得到标准偏差,按一定概率确定一个区间,对于超过这个区间的误差,就不属于随机误差而是粗大误差,需要将含有该误差的数据进行剔除
8.1
忘记记笔记了…