精华内容
下载资源
问答
  • 一个利用解释器模式进行的简单计算,只支持+,-,*,/,() 地址:https://gitee.com/hellobb/tools/tree/master/computing

    一个利用解释器模式进行的简单计算,只支持+,-,*,/,()
    地址:https://gitee.com/hellobb/tools/tree/master/computing

    展开全文
  • 利用Shap解释Xgboost(或者别的)模型

    千次阅读 2019-12-07 16:33:07
    Shap的一些介绍: SHAP包 算法解析 shap的中文解析 知乎的翻译 ps,sklearn库的模型可以用lime模块解析 本文参考利用SHAP解释Xgboost模型 数据集

    Shap的一些介绍:
    SHAP包
    算法解析
    shap的中文解析
    知乎的翻译
    ps,sklearn库的模型可以用lime模块解析

    DEMO1

    参(chao)考(xi)利用SHAP解释Xgboost模型
    数据集
    数据集基本做了特征处理,就基本也不处理别的了。

    检查下缺失值

    print(data.isnull().sum().sort_values(ascending=False))
    
    gk                          9315
    cam                         1126
    rw                          1126
    rb                          1126
    st                          1126
    cf                          1126
    lw                          1126
    cm                          1126
    cdm                         1126
    cb                          1126
    lb                          1126
    
    data.isnull().sum(axis=0).plot.barh()
    plt.title("Ratio of missing values per columns")
    plt.show()
    

    在这里插入图片描述

    获取年龄

    days = today - data['birth_date']
    print(days.head())
    
    0    8464 days
    1   12860 days
    2    7487 days
    3   11457 days
    4   14369 days
    Name: birth_date, dtype: timedelta64[ns]
    

    关于年龄计算这一块

    day2 = (today - data['birth_date'])
    
    0    8464 days
    1   12860 days
    2    7487 days
    3   11457 days
    4   14369 days
    Name: birth_date, dtype: timedelta64[ns]
    
    day2 = (today - data['birth_date']).apply(lambda x: x.days)
    #把天数提取成整数
    
    0     8464
    1    12860
    2     7487
    3    11457
    4    14369
    Name: birth_date, dtype: int64
    

    获得年龄特征

    data['age'] = np.round((today - data['birth_date']).apply(lambda x: x.days) / 365., 1)
    

    建立模型和输出

    随便选一些特征训练(主要是学习一下shap的用法)

    Feature importance:可以直观地反映出特征的重要性,看出哪些特征对最终的模型影响较大。但是无法判断特征与最终预测结果的关系是如何的。

    cols = ['height_cm', 'potential', 'pac', 'sho', 'pas', 'dri', 'def', 'phy', 'international_reputation', 'age']
    
    model = xgb.XGBRegressor(max_depth=4, learning_rate=0.05, n_estimators=150)
    model.fit(data[cols], data['y'].values)
    
    plt.figure(figsize=(15, 5))
    plt.bar(range(len(cols)), model.feature_importances_)
    plt.xticks(range(len(cols)), cols, rotation=-45, fontsize=14)
    plt.title('Feature importance', fontsize=14)
    plt.show()
    

    在这里插入图片描述

    采用shap(SHapley Additive exPlanation)验证模型

    解释器explainer

    explainer = shap.TreeExplainer(model)
    

    获取训练集data各个样本各个特征的SHAP值

    因为data中有10441个样本以及10个特征,得到的shap_values的维度是10441×10。

    shap_values = explainer.shap_values(data[cols])
    print(shap_values.shape)
    

    这里我是报错的。没找到原因。应该是自带的BUG。

    AssertionError: Additivity check failed in TreeExplainer! Please report this on GitHub. Consider retrying with the feature_dependence='independent' option.
    

    计算基线

    y_base = explainer.expected_value
    print(y_base)
    
    data['pred'] = model.predict(X_train)
    print(data['pred'].mean())
    
    229.16510445903987
    229.16512
    
    

    DEMO2

    Explain Your Model with the SHAP Values
    Explain Any Models with the SHAP Values — Use the KernelExplainer

    导入库

    import xgboost as xgb
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    plt.style.use('seaborn')
    pd.set_option('display.max_columns', 1000)
    pd.set_option('display.width', 1000)
    pd.set_option('display.max_colwidth', 1000)
    
    data = pd.read_csv("C:\\Users\\Nihil\\Documents\\pythonlearn\\data\\kaggle\\winequality-red.csv")
    

    检查数据

    print(data.info())
    
    Data columns (total 12 columns):
    fixed acidity           1599 non-null float64
    volatile acidity        1599 non-null float64
    citric acid             1599 non-null float64
    residual sugar          1599 non-null float64
    chlorides               1599 non-null float64
    free sulfur dioxide     1599 non-null float64
    total sulfur dioxide    1599 non-null float64
    density                 1599 non-null float64
    pH                      1599 non-null float64
    sulphates               1599 non-null float64
    alcohol                 1599 non-null float64
    quality                 1599 non-null int64
    dtypes: float64(11), int64(1)
    memory usage: 150.0 KB
    None
    
    print(data.head())
    
          fixed acidity  volatile acidity  citric acid  residual sugar  chlorides  free sulfur dioxide  total sulfur dioxide  density    pH  sulphates  alcohol  quality
    0            7.4              0.70         0.00             1.9      0.076                 11.0                  34.0   0.9978  3.51       0.56      9.4        5
    1            7.8              0.88         0.00             2.6      0.098                 25.0                  67.0   0.9968  3.20       0.68      9.8        5
    2            7.8              0.76         0.04             2.3      0.092                 15.0                  54.0   0.9970  3.26       0.65      9.8        5
    3           11.2              0.28         0.56             1.9      0.075                 17.0                  60.0   0.9980  3.16       0.58      9.8        6
    4            7.4              0.70         0.00             1.9      0.076                 11.0                  34.0   0.9978  3.51       0.56      9.4        5
    
    

    设置feature和target

    target = 'quality' 
    X_columns = [x for x in data.columns if x not in [target]]
    X = data[X_columns]
    Y = data['quality']
    

    训练一个随机森林模型

    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
    model = RandomForestRegressor(max_depth=6, random_state=0, n_estimators=10)
    model.fit(X_train, y_train)
    

    (A)Variable Importance Plot — Global Interpretability(全局可解释性)

    • 目的:variable importance plot 列出了最重要的变量,顶部特征对预测能力的贡献最大。
    import shap
    shap_values = shap.TreeExplainer(model).shap_values(X_train)
    shap.summary_plot(shap_values, X_train, plot_type="bar")
    

    在这里插入图片描述
    卧槽跟度数关于这么大么?(重点错

    SHAP value plot

    • 目的:The SHAP value plot可以进一步显示预测因子与目标变量之间的正、负关系
    shap.summary_plot(shap_values, X_train)
    

    在这里插入图片描述

    图还是很好看的。这个图是由所有训练数据构成,表达以下信息:

    • Feature importance 可以看出各特征对预测能力的贡献程度
    • Impact: 水平位置显示该值的影响是与较高还是较低的预测相关联。比如图上酒精就与1.0更相关
    • Original value 颜色显示该变量是该观察值的高(红色)还是低(蓝色)。
    • Correlation 酒精含量高对产品的质量等级有高而积极的影响。高来自红色,positive impact显示在x轴上。同样,挥发性酸度与目标变量呈负相关。

    (B) SHAP Dependence Plot — Global Interpretability

    含义:部分相关图显示了一个或两个特征对机器学习模型预测结果的边际效应(J. H. Friedman 2001)。
    Greedy function approximation: A gradient boosting machine.(上面那篇论文)
    Marginal effects measure the expected instantaneous change in the dependent variable as a function of a change in a certain explanatory variable while keeping all the other covariates constant. The marginal effect measurement is required to interpret the effect of the regressors on the dependent variable.
    它告诉我们目标和特征之间的关系是线性的、单调的还是更复杂的。
    代码如下:

    shap.dependence_plot('alcohol',shap_values, X_train)
    

    在这里插入图片描述
    下图显示“酒精”和目标变量之间存在近似线性和正相关,并且“酒精”经常与“Sulphates”相互作用。

    显示关于“挥发性酸度”的Dependence Plot

    shap.dependence_plot('volatile acidity',shap_values, X_train)
    

    在这里插入图片描述
    这是个负相关

    © Individual SHAP Value Plot — Local Interpretability(单个特征,局部解释性)

    这个图得用Jupyter,我先跳过吧。

    X_output = X_test.copy()
    X_output.loc[:,'predict'] = np.round(model.predict(X_output),2)
    random_picks = np.arange(1,330,50)#随便选点来观察
    S = X_output.iloc[random_picks]
    print(S)
    
             fixed acidity  volatile acidity  citric acid  residual sugar  chlorides  free sulfur dioxide  total sulfur dioxide  density    pH  sulphates  alcohol  predict
    1146            7.8             0.500         0.12             1.8      0.178                  6.0                  21.0  0.99600  3.28       0.87      9.8     5.51
    854             9.3             0.360         0.39             1.5      0.080                 41.0                  55.0  0.99652  3.47       0.73     10.9     5.94
    1070            9.3             0.330         0.45             1.5      0.057                 19.0                  37.0  0.99498  3.18       0.89     11.1     6.47
    697             7.0             0.650         0.02             2.1      0.066                  8.0                  25.0  0.99720  3.47       0.67      9.5     5.39
    1155            8.3             0.600         0.25             2.2      0.118                  9.0                  38.0  0.99616  3.15       0.53      9.8     5.17
    1553            7.3             0.735         0.00             2.2      0.080                 18.0                  28.0  0.99765  3.41       0.60      9.4     5.24
    99              8.1             0.545         0.18             1.9      0.080                 13.0                  35.0  0.99720  3.30       0.59      9.0     5.27
    

    对多个变量的交互进行分析

    shap_interaction_values = shap.TreeExplainer(model).shap_interaction_values(X_train)
    shap.summary_plot(shap_interaction_values, X_train, max_display=4)
    

    在这里插入图片描述

    展开全文
  • 利用CCA识别SSVEP信号的数学解释

    千次阅读 2020-09-05 21:10:37
    #利用CCA识别SSVEP信号的数学解释 #本篇由BCIduino脑机接口开源社区整理(公众号“BCIduino脑机接口社区”)。BCIduino脑机接口社区由来自北京航空航天大学、康奈尔大学、北京大学、首都医科大学等硕博发起成立,...

    #利用CCA识别SSVEP信号的数学解释
    #本篇由BCIduino脑机接口开源社区整理(公众号“BCIduino脑机接口社区”)。BCIduino脑机接口社区由来自北京航空航天大学、康奈尔大学、北京大学、首都医科大学等硕博发起成立,欢迎加入社群,备注"BCI",也欢迎采购BCIduino脑电模块(某宝搜索即可)。
    在这里插入图片描述

    SSVEP信号的特征分析主要是基于对刺激频率的识别。功率谱密度分析(PSDA)是提取SSVEP响应频率的传统方法。视觉刺激的频率是通过检测功率谱密度峰值的频率来确定的。
    2006年,Lin等人,提出了典型相关分析(CCA)作为SSVEP特征识别算法。与PSDA相比,它可以将多通道信号的数据结合起来,提高信噪比,提高目标识别精度。CCA通过计算两组信号的典型相关系数来分析SSVEP信号。其中一组信号是记录的EEG信号
    在这里插入图片描述
    其中n是信号采集电极的数量。另一组Y i是与视觉刺激频率相对应的参考信号。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    本文采用CCA方法的变形模态来确定识别目标。研究者用欧几里德范数组合每个刺激目标的n个相关系数,
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 关于信道利用率的总结与一道习题的最终解释

    万次阅读 多人点赞 2016-09-21 22:00:44
    信道利用率,也叫信道的效率,定义很多,但是常用的是时间角度的定义。OK,上定义:对发送方而言,发送方在一个发送周期内,有效地发送数据所需要的时间占整个发送周期的比率。那么,什么是发送周期?发送周期:发送...

    首先是概念。

    信道利用率,也叫信道的效率,定义很多,但是常用的是时间角度的定义。

    OK,上定义:对发送方而言,发送方在一个发送周期内有效地发送数据所需要的时间占整个发送周期的比率。

    那么,什么是发送周期

    发送周期:发送方从发送第一个数据开始,到接收到第一个确认帧为止。

    设发送周期为T,这个周期内发送的数据量为L,发送方的速率是C,则发送方用于发送有效数据的时间是L/C

    在这种情况下,信道的利用率是:
    (L/C)T \frac{(L/C)}{T} T(L/C)

    另外,信道的吞吐率 = 信道的利用率 * 发送方的发送速率

    看一道题目加深理解:

    (2012年联考) 两台主机之间的数据链路层采用了后退N帧协议(GBN)传输数据,数据的传输速率为16kbps,单向传播时延为270ms,数据帧的长度范围是128~512字节,接收方总是以数据帧等长的帧进行确认(即确认帧长度与发送的帧一样大)。为使信道利用率最高,帧序列的比特数至少是(B)

    A.5 B.4 C.3 D.2

    思考:本题用的并不是捎带确认,因此只需要看一个帧的确认即可。
    传输速率C = 16kbps
    延迟是R = 270ms
    设帧的大小是a字节。则发送周期是:T = a / C + 2 * R + a / C

    第一个a/c是发送方发送一帧的时间,2*R是发送的帧和确认帧的传播时延,这里的确认帧大小不可忽略,所以是a/C

    从而发送效率
    α=(a/C)(2∗(a/C+R)) \alpha = \frac{(a/C) } { (2*(a/C+R))} α=(2(a/C+R))(a/C)

    这里就是求如何使得α\alphaα最大。

    这样推导的结果是512B时利用率最高!

    但是答案又说,为了发送的数据帧数更多!Why? 帧数大和帧数多居然直接取帧数多作为优先?

    不科学,因此这题存疑

    update: 2016.11.13修正。

    我之前一直理解错了题干的含义。题干说数据帧的长度范围是128B~512B。我片面的认为取512B时可以使得数据链路不停发送数据,即利用率接近100%时,用的帧序号数最小。诚然,这没有任何可以争论的点。我存疑就是因为大部分的解释是,为了使信道利用率最高,需要多发帧。所以帧长越短越好。这个推导逻辑是不对的!因为无论使用128B还是512B都可以理论上达到最大的100%。现在是,我们需要考虑到最极端的情况,即帧序号用的编码比特数无论何时都能满足。很显然128B,帧长最小时,需要的帧序号编码数自然多与512B。如果就以512B计算,那么得到的最小帧序号数在128B的帧长下,达不到最大的信道利用率。因为帧序号数目的限制,连续发送的数目有限。这才是整个题目的设计逻辑。

    有了这个理解,问题就简单多了,我们考虑128B至少需要多少比特,就是我们需要的数。

    发送一帧用时:128B/16kbps = 64ms
    RTT = 540ms
    发送周期T = 64+RTT+64 = 668ms

    则连续不断发送时可以发送:668/64 = 10.4帧

    因此,需要比特数是n.

    2n≥10.4+12^n\geq 10.4+12n10.4+1即:要能够区分新旧轮次的帧。

    得到n至少为4.

    进一步思考:668ms发送10.4帧,则数据传输率是:15.942kbps
    10.4是取了约数的,即我们可以直接认为连续不断发送。则用16kbps,因此,每秒发送的帧数是:15.6帧。则一个发送周期内发送:10.4帧。
    也是一样的结果。

    特别注意,我们算帧数时,是以一个发送周期为单位计算的,不是1秒!
    我们担心的是不能区分每个发送周期的帧是新的还是旧的,因此,才来计算序号,换算成1秒发送多少,毫无意义!所以之前考察2015年的一道习题时理解错了。这里一并纠正。那边也更新了。

    END.

    展开全文
  • 利用conda在Hadoop-stream中使用定制python解释

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 793,569
精华内容 317,427
关键字:

利用怎么解释