python note

作者: thuxuxs | 来源:发表于2018-07-25 21:48 被阅读0次

    准备

    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
      \text{MSE}=\frac{1}{n}\sum_{i=1}^n(x_i-y_i)^2
    mse=1.0/len(x)*sum([(x[i]-y[i])**2 for i in range(len(x))])
    print(mse)
    
    • 均方根误差(root mean square error) RMSE
      \text{RMSE}=\sqrt{\frac{1}{n}\sum_{i=1}^n(x_i-y_i)^2}
    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
      \text{MAE}=\frac{1}{n}\sum_{i=1}^n\lvert x_i-y_i\rvert
    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
      \text{RMSLE}=\sqrt{\frac{1}{n}\sum_{i=1}^n(\log(x_i+1)-\log(y_i+1))^2}
    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')
    
    

    相关文章

      网友评论

        本文标题:python note

        本文链接:https://www.haomeiwen.com/subject/ypimmftx.html