准备
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data=pd.DataFrame(np.random.random([200,3]),columns=['a','b','c'])
data['d']=[np.random.randint(3) for i in range(200)]
相关系数
help(data.corr)
data.corr()
热图
help(sns.heatmap)
data.corr()
sns.heatmap(data.corr(),annot=True,linewidths=.5,fmt='.2f')
- [x] annot: 是否显示相关系数
- [x] fmt: 显示相关系数的格式,例如
'.2f'
,两位有效数字 - [x] linewidths: 热图中方块的间隔
DataFrame画图
data.a.plot(kind='line',linestyle=':',marker='*')
data.a.plot.hist(bins=20)
data.plot.scatter(x='a',y='b')
data.plot(kind='hist',bins=20,subplots=True,cumulative=True)
- [x] kind: 绘图类型
- line: 线形
-
hist: 柱状图,
bins
表示柱状图的个数 - bar: 条形图
- scatter: 散点图
- [x] subplots: 是否分开画图
统计种类数
data.d.value_counts()
sns.countplot(data.d)
- [x] pd.Series.value_counts
- [x] **
逻辑运算
a=[1,0,0,1,1]
b=[0,1,0,0,1]
np.logical_and(a,b)
np.logical_not(a)
np.logical_or(a,b)
np.logical_xor(a,b)
np.info(np.logical_and)
partial
from functools import partial
f=partial(lambda x,y,z:(x+z)*y,1,2)
f(3)
- [x]
partial(func,*args):
将函数的前几个参数固定住,而不修改原函数
数组的截断
a=range(9)
np.clip(a,3,7)
分离数据集和训练集
from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y=train_test_split(data.iloc[:,:-2],data.d,test_size=0.3,random_state=1)
train_x.head()
train_y.head()
- [x] test_size: 训练集大小
- [x] random_state: 设置随机种子
一些误差的定义
比较预测值x
和真实值y
之间的误差
x=[1,2,3,4,5,6]
y=[2,1,5,3,2,4]
- 均方误差(mean square error) MSE
mse=1.0/len(x)*sum([(x[i]-y[i])**2 for i in range(len(x))])
print(mse)
- 均方根误差(root mean square error) RMSE
rmse=np.sqrt(1.0/len(x)*sum([(x[i]-y[i])**2 for i in range(len(x))]))
print(rmse)
- 平均绝对误差(mean absolute error) MAE
mae=1.0/len(x)*sum([abs(x[i]-y[i]) for i in range(len(x))])
print(mae)
- 均方根误差对数误差(root mean squared logarithmic error) RMSLE
rmsle=np.sqrt(1.0/len(x)*sum([(np.log1p(x[i])-np.log1p(y[i]))**2 for i in range(len(x))]))
print(rmsle)
- [x] RMSLE会更多的惩罚欠拟合
- [x]
np.log1p
计算加一后的对数,其逆运算是np.expm1
- [x] 采用此误差函数时,可以先对原始数据做
np.log1p
,再使用RMSE
ROC
在二分类问题中常使用ROC和AUC来作为误差函数。对于二分类问题,预测结果和真是结果可能有如下的一些关系
预测 | |||
---|---|---|---|
1 | 0 | ||
实际 | 1 | True Positive(TP) | False Negative(FN) |
0 | False Positive(FP) | True Negative(TN) |
(True/False)(Positive/Negative)=(预测的正确性)(预测的值)
- [x] 真正率(TPR): 识别出的正实例占所有正实例的比例,TPR=TP/(TP+FN)
- [x] 假正率(FPR):错误识别的正实例(实际为负实例)占所有负实例的比例,FPR=FP/(FP+TN)
由于预测值是连续的,我们选择不同的阈值来作为判断预测值是正实例还是负实例的依据,在此预测值下算出真正率和假正率,并假正率为x坐标,真正率为y坐标画出来的曲线即为ROC曲线,ROC曲线下的面积几位AUC。
当AUC的面积越接近与1时,说明预测的越准,如果为0.5则说明预测的值跟实际不相关。
from sklearn.metrics import roc_curve,auc
import numpy as np
import matplotlib.pyplot as plt
x=np.array([np.random.choice([0,1]) for i in range(1000)])
y=x+(np.random.random(1000)-0.5)*2
fpr,tpr,threahold=roc_curve(x,y)
print('auc:{}'.format(auc(fpr,tpr)))
plt.plot(fpr,tpr)
DataFrame删除列
data.drop('a',axis=1).head()
生成字典的新方法
tmp={'a':1,'b':2}
dict(tmp,a=3,c=4)
dict(a=3,d=4)
dict(dict(a=3,d=4),a=1)
pandas时间
- 基本结构Timestamp
pd.to_datetime(pd.datetime(2018,6,13,23,54))
now=pd.to_datetime('20180613235430')
now
now.weekday_name
now.dayofyear
- 生成时间序列
time=pd.date_range('6/12/2018',periods=200,freq='5D')
time=pd.Series(time)
data['time']=time
-
[x] periods: 得到的总的个数
-
[x] freq: 每隔多少天、月、年等
-
提取时间
time.dt.dayofweek
time.dt.month
pandas的index
help(pd.DataFrame.reset_index(drop=True)
t=pd.DataFrame([[1,2],[3,4]],['a','b'],columns=['c','d'])
t.reset_index()
t.reset_index(drop=True)
- [x]
drop=True:
直接将index删掉并设置为0开始的序列
pandas提取不同类型的列
data.dtypes.to_dict()
data.select_dtypes(exclude=['int64'])
data.select_dtypes(include=['datetime64','float64'])
- [x] pd.to_dict: 直接将序列转化为字典,同样可以利用
to_csv
来保存数据 - [x] select_dtypes: 选取特定的类型的列
pandas未知类型的参数化
help(pd.factorize)
pd.factorize(['a','c',np.nan,1,120,np.max,np.mean,np.max])
数据处理技巧
- [x] 将训练集和测试集放到同一个大表中进行处理,使得对这两个数据集的处理方法相同
- [x] 对于object对象可以利用
pd.factorize
来进行数字化,可理解为编号 - [x] 对于跟时间有关的数据集,可添加以下的特征到表格中
- 这一天为是周内的第几天,也即星期几
- 月份
- 本周是这年的第几周
- 以上这些特征在全部数据集中出现的次数,利用
value_counts().to_dict()
和map()
来实现,示例 - 这一天距月末和月初的最短距离
- 这一天小于7号,设为0,大于24号设为2,其余设为1
- [x]
scipy.stats.skew:
添加分布的倾斜度(偏差) - [x]
scipy.stats.kurtosis:
添加分布的峰度
from scipy.stats import skew,kurtosis
skew([1,3,2,4,5])
skew([0,1,2,2,3,3,4])
kurtosis([0,1,2,2,3,3,4])
- [x]
numpy.percentile
添加分布的分位数
np.percentile([1,2,3,3,4],50)
np.percentile([1,2,3,3,4],75)
np.percentile([1,2,3,3,4],25)
np.percentile([1,2,3,3,4],90)
XGBoost
参数定义
- [x] eta [default=0.3]: shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。
- [x] min_child_weight [default=1]: 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该
参数值越小,越容易过拟合
。 - [x] max_depth [default=6]: 每颗树的最大深度,
树高越深,越容易过拟合
。 - [x] max_leaf_nodes: 最大叶结点数,与max_depth作用有点重合。
- [x] gamma [default=0]: 后剪枝时,用于控制是否后剪枝的参数。
- [x] max_delta_step [default=0]: 这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。
- [x] subsample [default=1]: 样本随机采样,较低的值使得算法更加保守,防止过拟合,但是
太小的值也会造成欠拟合
。 - [x] colsample_bytree [default=1]: 列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1
- [x] lambda [default=1]: 控制模型复杂度的权重值的L2正则化项参数,
参数越大,模型越不容易过拟合
。 - [x] alpha [default=0]: 控制模型复杂程度的权重值的 L1 正则项参数,
参数值越大,模型越不容易过拟合
。 - [x] scale_pos_weight [default=1]: 如果取值大于0的话,在类别样本不平衡的情况下
有助于快速收敛
。
sklearn
- [x]
sklearn.externals.joblib:
用来保存数据 - [x]
sklearn.feature_selection.VarianceThreshold:
通过数据的方差阈值来挑选特征,bool矩阵取反~a
numpy
- [x]
np.unique:
返回数组中唯一的那些数,并返回多对应的位置
np.unique(['a','b','b','c','a'],return_index=True)
- [x]
np.isin(x,y):
返回x中的元素是否在y中的bool矩阵
np.isin([[1,2],[4,3]],[2,3])
- [x]
np.where(condition,[x,y]):
返回满足条件的位置的横纵坐标,如果x和y给出来了,则返回用x和y来填充满足条件的bool矩阵,满足条件的用x填充,不满足条件的用y填充
np.where(np.array([[1,3],[4,2]]))
np.where(np.array([[1,3],[4,2]])>2)
np.where(np.array([[1,3],[4,2]])>2,'big','small')
网友评论