精华内容
下载资源
问答
  • telecom_churn-数据集

    2021-03-14 17:42:24
    telecom_churn.csv
  • CIK Telecom-crx插件

    2021-03-15 17:30:02
    CIK Telecom是加拿大顶级互联网服务提供商之一,于2003年在多伦多成立。 CIK拥有400多名员工,在加拿大,美国,中国,越南,印度和摩洛哥设有办事处。 我们在加拿大的每个主要城市都有本地支持中心。 自2003年以来,...
  • 橙色电信的客户流失数据集将用于开发预测模型,该数据集由清除的客户活动数据(功能)以及指定客户是否取消订阅的客户流失标签组成。这里提供了两个数据集:可以下载churn-80和churn-20数据集。...telecom_churn.csv
  • telecom-源码

    2021-03-18 02:32:30
    telecom
  • iPhone41.ipcc最新IOS14提取 苹果11在IOS13下测试了 电信卡的移动卡的 没有联通卡 没测试
  • var telecom = require('telecom-sms'); var client = new telecom.client('appid','app_secret'); client.bindEvents() .on('received_token',function(access_token,expires){console.log(access_token,expires)...
  • 包含中国电信38.0等等IPCC文件 只适用于有锁机 国行及其他无用 有锁机日常使用比较麻烦 请认准需求再下手
  • 英国Silver Telecom公司日前推出Ag8100系列以太网络供电模块的受电设备(PD),并采用SMT封装。此一系列是继之前所推出的Ag8000系列,特别是针对系统本身需求更小的模块体积。同时,该产品符合IEEE 802.3af以及RoHS...
  • ChinaTelecom_USIM_cn_iPhone.ipcc 36.1
  • Telecom-数据集

    2021-03-31 03:56:45
    Telecom-数据集
  • telecom infrastructure project by Facebook, experimental.
  • Telecom-Users-Dataset-源码

    2021-03-21 23:34:23
    Telecom-Users-Dataset
  • IPCC电信41.1
  • 为帮助电信服务供应商以低成本迅速开发和推广新型的增值服务,IBM 最近推出了 IBM WebSphere Telecom Application Server 1.2 版。它有可能将电信应用的开发和实施成本降低 30% 到 50%,并有助于增加收入,因为供应...
  • Telecom-Customer-Data-源码

    2021-03-09 00:47:43
    电信客户数据
  • 中国电信支持者 Magisk模块可支持中国电信SIM卡和Pixel 3的VoLTE。 本模块内容: 将这些行插入文件/system/vendor/rfs/msm/mpss/readonly/vendor/mbn/mcfg_sw/mbn_sw.txt mcfg_sw/generic/China/CT/Commercial/...
  • Orange telecom 客户流失情况数据源, 3333 条数据,21个特征, 可用户客户流失分析,聚类分析,客户流失预测等
  • Telecom-churn-prediction:预测哪些客户流失的风险很高
  • telecom_churn_case_study
  • 最新IOS14.3 提取 只提取了电信的 因为目前IOS11 对电信支持不是很好
  • 项目-流失率 通过电信公司周转率分析客户 项目背景 公司希望创建一个行动计划,目的是减少逃避客户的行为,即防止客户取消其合同并且不将其续签另外12个月。 在业务指标中,这种规避被称为流失。...
  • 환영합니다 SK텔레콤오픈소스사이트에환영합니다。 서는기서는SK텔레콤의오픈소스프로젝트를소개하고기있습니블로블있습니다。 을。 기여하기 SK텔레콤오픈소스사이트는여러분의로개선됩니다。...
  • api API stream-telecom.ru( )。 Вданномпакетереализованыследующиеметоды: Просмотрбаланса; Выгрузкатарифов; Выгрузка...
  • CMOS Telecom Data Converters--2003 [609].pdf
  • Telecom_Customer_Churn
  • Amp Telecom Click2Call Amp Telecom的Click2Call在与您的Amp Telecom帐户关联的台式电话,网络电话或任何启用VOIP / SIP的设备连接的网页和Web应用程序上创建可单击的链接。 易于使用。 下载并安装扩展程序后,单击...
  • testing_y -目标变量(用于测试) # cf -[‘coefficient’, ‘feature’]逻辑回归的相关系数 # threshold_plot-如果为True,返回模型的阈值图 3.2 构建函数,实现传入算法及数据集,输出模型表现指标 def telecom_...

    5 Model Building:模型构建

    划分数据集及相关函数构建

    1. 加载相应库

    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
    from sklearn.metrics import roc_auc_score, roc_curve, scorer, f1_score
    import statsmodels.api as sm
    from sklearn.metrics import precision_score, recall_score
    from yellowbrick.classifier import DiscriminationThreshold
    

    2. 划分数据

    # 区分训练集和测试集
    train, test = train_test_split(telcom, test_size=0.25, random_state=111)
    # 区分独立和非独立变量
    cols = [i for i in telcom.columns if i not in Id_col+target_col]
    train_X = train[cols]
    train_Y = train[target_col]
    test_X = test[cols]
    test_Y = test[target_col]
    

    3. 建模函数及可视化函数构建

    3.1 建模函数变量说明

    # 构建方程元素
    # dataframe     -用于构建模型的数据表
    # Algorithm     -使用的算法
    # training_x    -用于训练的数据
    # testing_x     -用于预测的测试集
    # training_y    -目标变量(用于训练)
    # testing_y     -目标变量(用于测试)
    # cf            -[‘coefficient’, ‘feature’]逻辑回归的相关系数
    # threshold_plot-如果为True,返回模型的阈值图
    

    3.2 构建函数,实现传入算法及数据集,输出模型表现指标

    def telecom_churn_prediction(algorithm, training_x, testing_x, training_y, testing_y, cols, cf, thredshold_plot):
        # 模型构建
        algorithm.fit(training_x, training_y)
        preds = algorithm.predict(testing_x)
        prob = algorithm.predict_proba(testing_x)
    
        # 相关性
        if cf == 'coefficients':
            coefficients = pd.DataFrame(algorithm.coef_.ravel())
        elif cf == 'features':
            coefficients = pd.DataFrame(algorithm.feature_importances_)
    
        column_df = pd.DataFrame(cols)
        coef_sumry = (pd.merge(coefficients, column_df, left_index=True,
                               right_index=True, how='left'))
        coef_sumry.columns = ['coefficients', 'features']
        coef_sumry = coef_sumry.sort_values(by='coefficients', ascending=False)
    
        print(algorithm)
        print('\n Classification report: \n', classification_report(testing_y, preds))
        print('Accuracy Score: ', accuracy_score(testing_y, preds))
    
        # 混淆矩阵
        conf_matrix = confusion_matrix(testing_y, preds)
    
        # roc_auc_score得分
        model_roc_auc = roc_auc_score(testing_y, preds)
        print('Area under curve: ', model_roc_auc, '\n')
        fpr, tpr, thredsholds = roc_curve(testing_y, prob[:, 1])
    
        # 绘制混淆矩阵图
        trace1 = go.Heatmap(z=conf_matrix, x=['Not Churn', 'Churn'], y=['Not Churn', 'Churn'],
                            showscale=False, colorscale='Picnic', name='Matrix')
    
        # 绘制roc曲线
        trace2 = go.Scatter(x=fpr, y=tpr, name='Roc: '+str(model_roc_auc),
                            line=dict(color='rgb(22,96,167)', width=2))
        trace3 = go.Scatter(x=[0, 1], y=[0, 1], line=dict(color=('rgb(205, 12, 24)'),
                                                          width=2, dash='dot'))
        # 绘制相关性图
        trace4 = go.Bar(x=coef_sumry['features'], y=coef_sumry['coefficients'],
                        name='Coefficients',
                        marker=dict(color=coef_sumry['coefficients'],
                                    colorscale='Picnic',
                                    line=dict(width=0.6, color='black')))
        # 合并绘制
        fig = tls.make_subplots(rows=2, cols=2, specs=[[{}, {}], [{'colspan':2}, None]],
                                subplot_titles=('Confusion Matrix', 'Receiver operating characteristic',
                                                'Feature Importances'))
    
        fig.append_trace(trace1, 1, 1)
        fig.append_trace(trace2, 1, 2)
        fig.append_trace(trace3, 1, 2)
        fig.append_trace(trace4, 2, 1)
    
        fig['layout'].update(showlegend=False, title='Model perfomance', autosize=False,
                             height=900, width=800,
                             plot_bgcolor='rgba(240,240,240,0.95)', paper_bgcolor='rgba(240,240,240,0.95)',
                             margin=dict(b=195))
        fig['layout']['xaxis2'].update(dict(title='false positive rate'))
        fig['layout']['yaxis2'].update(dict(title='ture positive rate'))
        fig['layout']['xaxis3'].update(dict(showgrid=True, tickfont=dict(size=10),
                                            tickangle=90))
        py.iplot(fig)
    
        if thredshold_plot == True:
            visualizer = DiscriminationThreshold(algorithm)
            visualizer.fit(training_x, training_y)
            visualizer.poof()
    

    5.1 基本线性模型(Baseline Model)

    logit = LogisticRegression(C=1.0, class_weight='liblinear', tol=0.0001, 
                               verbose=0, warm_start=False)
    telecom_churn_prediction(logit, train_X, test_X, train_Y, test_Y, cols, 
                             'coefficients', thredshold_plot=True)
    

    ** 结果输出:**
    report结果

    • 模型准确率得分0.7998分
      混淆矩阵
    • 不知道为什么混淆矩阵也优点飘,求大神解答
      特征重要性排序
      得分随指标变化情况

    5.2 人工少数类过抽样技术(Synthetic Minority Oversampling TEchnique (SMOTE))

    5.2.1 使用过抽样区分数据集和测试集

    from imblearn.over_sampling import SMOTE
    
    cols = [i for i in telcom.columns if i not in Id_col+target_col]
    
    smote_X = telcom[cols]
    smote_Y = telcom[target_col]
    
    # 区分训练集和测试机
    smote_train_X, smote_test_X, smote_train_Y, smote_test_Y = train_test_split(
        smote_X, smote_Y, test_size=.25, random_state=111)
    
    # 使用过抽样
    os = SMOTE(random_state=0)
    os_smote_X, os_smote_Y = os.fit_sample(smote_train_X, smote_train_Y)
    os_smote_X = pd.DataFrame(data=os_smote_X, columns=cols)
    os_smote_Y = pd.DataFrame(data=os_smote_Y, columns=target_col)
    

    5.2.2 对数据集使用基本线性模型

    logit_smote = LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                                     max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2',
                                     random_state=None, solver='liblinear', tol=0.0001,
                                     verbose=0, warm_start=False)
    telecom_churn_prediction(logit_smote, os_smote_X, test_X, os_smote_Y, test_Y,
                             cols, 'coefficients', thredshold_plot=True)
    

    过抽样基本线性回归模型report
    过抽样基本线性模型混淆矩阵
    过抽样基本线性模型特征重要性
    过抽样基本线性模型阈值与得分变化情况

    5.3 递归式特征消除法(Recursive Feature Elimination(RFE))

    结果输出:
    RFE方法基本线性模型report
    RFE方法基本线性回归模型表现
    RFE方法基本线性模型特征重要性
    RFE方法基本线性模型阈值与得分变化

    5.4 单变量特征选取(Univariate Selection)

    5.4.1 特征选取代码

    from sklearn.feature_selection import chi2
    from sklearn.feature_selection import SelectKBest
    
    #select columns
    cols = [i for i in telcom.columns if i not in Id_col + target_col ]
    
    #dataframe with non negative values
    df_x = df_telcom_og[cols]
    df_y = df_telcom_og[target_col]
    
    #fit model with k= 3
    select = SelectKBest(score_func = chi2,k = 3)
    fit    = select.fit(df_x,df_y)
    

    5.4.2 结果显示

    #Summerize scores
    print ("scores")
    print (fit.scores_)
    print ("P - Values")
    print (fit.pvalues_)
    
    #create dataframe
    score = pd.DataFrame({"features":cols,"scores":fit.scores_,"p_values":fit.pvalues_ })
    score = score.sort_values(by = "scores" ,ascending =False)
    
    # 为分类变量和数值变量创建新标签
    score['feature_type'] = np.where(score['features'].isin(num_cols), 'Numerical', 'Categorical')
    
    # 绘图
    trace = go.Scatter(x=score[score['feature_type']=='Categorical']['features'], 
                       y=score[score['feature_type']=='Categorical']['scores'], 
                       name='Categorical', mode='lines+markers', 
                       marker=dict(color='red', line=dict(width=1)))
    trace1 = go.Bar(x=score[score['feature_type']=='Numerical']['features'], 
                    y=score[score['feature_type']=='Numerical']['scores'], 
                    name='Numerical', marker=dict(color='royalblue', line=dict(width=1)),
                    xaxis='x2', yaxis='y2')
    layout = go.Layout(dict(
        title='Scores for Categorical & Numerical features', 
        plot_bgcolor='rgb(243, 243, 243)', paper_bgcolor='rgb(243, 243, 243)', 
        xaxis=dict(gridcolor='rgb(255, 255, 255)', tickfont=dict(size=10), 
                   domain=[0, 0.7], ticklen=5, gridwidth=2),
        yaxis=dict(gridcolor='rgb(255, 255, 255)', title='scores', zerolinewidth=1, 
                   ticklen=5, gridwidth=2),
        margin=dict(b=200), 
        xaxis2=dict(gridcolor='rgb(255, 255, 255)', domain=[0.8, 1], tickangle=90),
        yaxis2=dict(anchor='x2', gridcolor='rgb(255, 255, 255)')
    ))
    
    data = [trace, trace1]
    fig = go.Figure(data=data, layout=layout)
    py.iplot(fig)
    

    ** 结果输出:**
    得分输出
    分类变量与数值型变量的贡献情况

    5.5 决策树模型可视化

    5.5.1 使用上述特征选取结果的前三名来构建决策树——gini

    from sklearn.tree import DecisionTreeClassifier
    from sklearn import tree
    import graphviz
    
    # 前三个分类变量
    features_cat = score[score['feature_type']=='Categorical']['features'][:3].tolist()
    
    # 前三个数值型变量
    features_num = score[score['feature_type']=='Numerical']['features'][:3].tolist()
    

    ** 构建决策树所需变量说明:**

    # 函数元素
    # columns       -选择的列
    # maximum_depth -树的大小
    # criterion_type- 【’gini‘或者’entropy‘】
    # split_type    - 【’best‘或者’random‘】
    # Model Performance - True(给出模型输出)
    

    决策树及指标可视化

    def plot_DT(columns, maximum_depth, criterion_type, split_type, filename, model_performance=None):
    
        dtc_x = df_x[columns]
        dtc_y = df_y[target_col]
    
        # 建模
        dt_classifier = DecisionTreeClassifier(max_depth=maximum_depth,
                                               splitter=split_type,
                                               criterion=criterion_type)
        dt_classifier = dt_classifier.fit(dtc_x, dtc_y)
    
        data = tree.export_graphviz(dt_classifier, out_file=None, rounded=True,
                                            proportion=False, feature_names=columns,
                                            precision=2, class_names=['Not churn', 'churn'],
                                            filled=True)
    
        # 绘图
        graph = graphviz.Source(data)
        path = 'D:\\temp-pdf\\'+ filename
        graph.render(directory=path)
    
        if model_performance == True:
            telecom_churn_prediction(dt_classifier, dtc_x, test_X[columns],
                                     dtc_y, test_Y, columns, 'features', thredshold_plot=True)
    
    
    plot_DT(features_num, 3, 'gini', 'best', filename='tree_D_num')
    

    结果输出:
    决策树模型report
    决策树模型混淆矩阵
    决策树模型特征重要性
    决策树阈值得分变化情况

    5.5.2 5.5.1 使用上述特征选取结果的前三名来构建决策树——entropy

    plot_DT(features_cat, 3, 'entropy', 'best', filename='tree_DT_cat', model_performance=True)
    

    ** 结果输出:**
    entropy-report
    entropy-模型表现
    entropy-变量重要性
    entropy-阈值得分变化情况

    5.6 KNN模型

    5.6.1 构建模型可视化函数

    def telecom_churn_prediction_alg(algorithm, training_x, testing_x, training_y, testing_y, thredshold_plot=True):
        # 构建模型
        algorithm.fit(training_x, training_y)
        preds = algorithm.predict(testing_x)
        probs = algorithm.predict_proba(testing_x)
    
        print(algorithm)
        print('\n Classification report: \n', classification_report(testing_y, preds))
        print('Accuracy Score: ', accuracy_score(testing_y, preds))
    
        # 混淆矩阵
        cm = confusion_matrix(testing_y, preds),
        # roc得分
        model_roc_auc = roc_auc_score(testing_y, preds)
        print('Area under curve:', model_roc_auc)
        fpr, tpr, thresholds = roc_curve(testing_y, probs[:, 1])
    
        # 绘制roc曲线
        trace1 = go.Scatter(x=fpr, y=tpr, name='Roc'+str(model_roc_auc),
                            line=dict(color=('rgb(22, 96, 167)'), width=2))
        trace2 = go.Scatter(x=[0, 1], y=[0, 1],
                            line=dict(color=('rgb(205, 12, 24)'), width=2, dash='dot'))
        trace3 = go.Heatmap(z=cm, x=['Not churn', 'churn'], y=['Not churn', 'churn'],
                            showscale=False, colorscale='Blues', name='Matrix',
                            xaxis='x2', yaxis='y2')
        layout = go.Layout(dict(title='Model performance', autosize=False,
                                height=500, width=800, showlegend=False,
                                plot_bgcolor='rgb(243, 243, 243)', paper_bgcolor='rgb(243, 243, 243)',
                                xaxis=dict(title='false positive rate', gridcolor='rgb(255, 255, 255)',
                                           domain=[0, 0.6], ticklen=5, gridwidth=2),
                                yaxis=dict(title='true posotive rate', gridcolor='rgb(255, 255, 255)',
                                           zerolinewidth=1, ticklen=5, gridwidth=2),
                                margin=dict(b=200),
                                xaxis2=dict(domain=[0.7, 1], tickangle=90, gridcolor='rgb(255, 255, 255)'),
                                yaxis2=dict(anchor='x2', gridcolor='rgb(255, 255, 255)')))
        data=[trace1, trace2, trace3]
        fig = go.Figure(data=data, layout=layout)
    
        py.iplot(fig)
    
        if thredshold_plot == True:
            vz = DiscriminationThreshold(algorithm)
            vz.fit(training_x, training_y)
            vz.poof()
    

    5.6.2 实例化KNN模型,调用函数进行可视化展现

    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', 
                               metric_params=None, n_jobs=1, n_neighbors=5, weights='uniform')
    telecom_churn_prediction_alg(knn, os_smote_X, test_X, os_smote_Y, test_Y, thredshold_plot=True)
    

    ** 结果输出:**
    KNN-report
    KNN模型表现
    KNN-阈值得分变化情况

    5.7 随机森林分类器单个树可视化展现

    5.7.1 导入库,函数构建变量说明及函数构建

    from sklearn.ensemble import RandomForestClassifier
    
    # 函数元素:
    # columns       - 使用到的列
    # nf_estimators -随机森林的树的数量
    # estimated_tree-使用到的树的数量
    # maximum——tree -最大深度
    # criterion_tree-使用’gini‘还是’entropy‘来确定构建决策树模型
    # Model_performance-打印模型的表现
    
    def plot_tree_rf(columns, nf_estimators, estimated_tree, maximum_depth,
                     criterion_type, tree_name, model_pf=None):
        
        df = df_telcom_og[columns+target_col].copy()
    
        # 区分训练集和测试集
        rf_x = df[[i for i in columns if i not in target_col]]
        rf_y = df[target_col]
    
        # 随机森林分类器模型构建
        rfc = RandomForestClassifier(n_estimators=nf_estimators, max_depth=maximum_depth,
                                     criterion=criterion_type)
        rfc.fit(rf_x, rf_y)
        estimated_tree=rfc.estimators_[estimated_tree]
    
        graph = graphviz.Source(tree.export_graphviz(estimated_tree, out_file=None, rounded=True,
                                                     proportion=False, feature_names=columns, precision=2,
                                                     class_names=['Not churn', 'churn'], filled=True))
        path = 'D:\\temp-pdf\\'+tree_name
        graph.render(directory=path)	# 储存为pdf格式
    
        # 模型表现
        if model_pf == True:
            telecom_churn_prediction(rfc, rf_x, test_X[columns], rf_y, test_Y,
                                     columns, 'features', thredshold_plot=True)
    
    • 原文中,是用display方法将决策树显示出来。但是运行的时候,发现这样太慢。
    • 所以改成用render,将决策树存储为pdf文件,放在D盘中。

    结果输出:
    决策树文件夹
    PDF截图

    5.7.2 实例化随机森林模型,调用函数进行可视化

    调用函数:

    cols1 = [i for i in train_X.columns if i not in target_col+Id_col]
    plot_tree_rf( cols1, 100, 99, 3, 'entropy', 'rf-tree1', True)
    

    结果输出:
    RF-report
    RF-模型表现
    RF-特征重要性
    RF-阈值得分

    5.8 构建有十棵树的随机森林分类器

    # 构建一个有10棵树的随机森林模型
    n = np.arange(0, 10).tolist()
    cols1 = [i for i in train_X.columns if i not in target_col+Id_col]
    for i in n:
        tree_name = 'tree-rf-%d' %i
        plot_tree_rf(cols1, 10, i, 3, 'entropy',tree_name=tree_name, model_pf=False)
    
    
    • 以上代码将调用函数的model_pf参数设置为False,不显示每棵树的report、模型表现、特征重要性和阈值得分变化表。
    • 输出结果,就是10棵树的PDF文件。

    5.9 朴素贝叶斯模型(NB)

    # 朴素贝叶斯方法
    from sklearn.naive_bayes import GaussianNB
    gnb = GaussianNB(priors=None)
    
    telecom_churn_prediction_alg(gnb, os_smote_X, test_X, os_smote_Y, test_Y)
    

    结果输出:
    NB-report
    NB-模型表现
    NB-阈值得分

    5.10 支持向量机(SVC)

    # 支持向量机SVM
    from sklearn.svm import SVC
    
    # 支持向量机分类器
    # 使用线性超平面
    svc_lin = SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr',
                  degree=3, gamma=1.0, kernel='linear', max_iter=-1, probability=True,
                  random_state=None, shrinking=True, tol=0.001, verbose=False)
    cols = [i for i in telcom.columns if i not in target_col+Id_col]
    telecom_churn_prediction(svc_lin, os_smote_X, test_X, os_smote_Y, test_Y, cols,
                             'coefficients', thredshold_plot=False)
    

    结果输出:
    SVCLinear-report
    SVCLinear-模型表现
    SVCLinear-特征重要性

    5.11 SVC调参

    # 使用非线性超平面‘rbf’
    svc_rbf = SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr',
                  degree=3, gamma=1.0, kernel='rbf', max_iter=-1, probability=True,
                  random_state=None, shrinking=True, tol=0.001, verbose=False)
    telecom_churn_prediction_alg(svc_rbf, os_smote_X, test_X, os_smote_Y, test_Y, thredshold_plot=False)
    

    ** 结果输出:**
    SVCrbf-report
    SVCrbf-模型表现

    5.12 LightGBM分类器

    # 使用LightGBMClassifier
    from lightgbm import LGBMClassifier
    
    lgbm_c = LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,
                            learning_rate=0.5, max_depth=7, min_child_samples=20, min_child_weight=0.001,
                            min_split_gain=0.0, n_estimators=100, n_jobs=-1, num_leaves=500, objective='binary',
                            random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=True, subsample=1.0,
                            subsample_for_bin=200000, subsample_freq=0)
    cols = [i for i in telcom.columns if i not in target_col+Id_col]
    telecom_churn_prediction(lgbm_c, os_smote_X, test_X, os_smote_Y, test_Y,
                             cols, 'features', thredshold_plot=True)
    

    ** 结果输出:**
    LightGBM-report
    LightGBM-模型表现
    LightGBM-特征重要性
    LightGBM-阈值得分变化

    5.13 XGBoost分类器

    # XGBoost 算法
    from xgboost import XGBClassifier
    xgc = XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bytree=1, 
                        gamma=0, learning_rate=0.9, max_delta_step=0, max_depth=7, min_child_weight=1, 
                        missing=None, n_estimators=100, n_jobs=1, nthread=None, objective='binary:logistic', 
                        random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1)
    
    telecom_churn_prediction(xgc, os_smote_X, test_X, os_smote_Y, test_Y, 
                             cols, 'features', thredshold_plot=True)
    

    ** 结果输出:**
    XGB-report
    XGB-模型表现
    XGB-特征重要性
    XGB-阈值得分变化

    数据集下载地址:

    数据集及更多notebook浏览地址

    展开全文
  • Telecom服务

    千次阅读 2017-03-06 15:10:33
    telecom服务概述 android5.0之后通信系统重构比较大,framework和app层都加入了Telecomm包。 framework是frameworks/base/telecomm/,app是packages/services/Telecomm telecomm继原先的phone服务之后又加入了...

    telecom服务概述

    android5.0之后通信系统重构比较大,framework和app层都加入了Telecomm包。

    framework是frameworks/base/telecomm/,app是packages/services/Telecomm

    telecomm继原先的phone服务之后又加入了telecom服务,客户端使用的文件是:

    frameworks/base/telecomm/java/com/android/internal/telecom/ITelecomService.java

        /**
         * @see TelecomServiceImpl#silenceRinger
         */
        void silenceRinger(String callingPackage);
    该类中有很多方法,例如该文件中定义了silenceRinger方法,功能是停止来电响铃。熟悉更早版本代码的同学会知道该方法原先是phone服务中实现的,5.0后转到了telecom服务。

    服务实现和启动

    服务实现在packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java

      private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
             ...
            /**
             * @see android.telecom.TelecomManager#silenceRinger
             */
            @Override
            public void silenceRinger(String callingPackage) {
                synchronized (mLock) {
                    enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
    
                    long token = Binder.clearCallingIdentity();
                    try {
                        Log.i(this, "Silence Ringer requested by %s", callingPackage);
                        mCallsManager.getRinger().silence();
                    } finally {
                        Binder.restoreCallingIdentity(token);
                    }
                }
            }
            ...
    }
       public ITelecomService.Stub getBinder() {
            return mBinderImpl;
        }
    该类有个getBinder函数,被packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java使用
    public class TelecomService extends Service implements TelecomSystem.Component {
    
        @Override
        public IBinder onBind(Intent intent) {
            Log.d(this, "onBind");
            initializeTelecomSystem(this);
            synchronized (getTelecomSystem().getLock()) {
                return getTelecomSystem().getTelecomServiceImpl().getBinder();
            }
        }
        ...
    }
    在AndroidManifest.xml中:

            <service android:name=".components.TelecomService"
                    android:singleUser="true"
                    android:process="system">
                <intent-filter>
                    <action android:name="android.telecom.ITelecomService" />
                </intent-filter>
            </service>
    可见该TelecomService就是Android四大组件中的Service,不过特殊之处是运行在system进程中

    至于这个Service是谁启动的,而telecom服务怎么通过ServiceManager.addService添加到系统服务中,见 android 5.1 TelecomService启动过程,懒得重复劳动了

    服务使用

    frameworks/base/telecomm/java/android/telecom/TelecomManager.java

        private ITelecomService getTelecomService() {
            return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE));
        }
    
       public void silenceRinger() {
            try {
                if (isServiceConnected()) {
                    getTelecomService().silenceRinger(mContext.getOpPackageName());
                }
            } catch (RemoteException e) {
                Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
            }
        }
    与TelephonyManager类似,通过binder调用telecom服务。有趣的是TelephonyManager也使用了该方法:

      public void silenceRinger() {
            try {
                getTelecomService().silenceRinger(getOpPackageName());
            } catch (RemoteException e) {
                Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
            }
        }
    这个就纯粹是历史原因了,因为这个方法本来就是在TelephonyManager中的,而且用的是phone服务。之前有很多代码已经写了,这个方法目前实在是不好删除啊。

    和phone服务的关系

    telecom服务和phone服务的关系其实就是Telecomm.apk和TeleService.apk之间的关系。
    telecomm是一个更一般的通讯框架,从它运行在system进程中就可以看出它的地位,gsm,cdma等蜂窝电话的技术细节和规范实现被保留在TeleService中。
    除了这两个基本的通信方式外,还有国外比较普及的SIP通话,wifi通话,将来5G要普及的数据信号通话(目前还是模拟信号为主,微信qq等的语音或视频通话算是数字信号但是并不普及,没有运营商主干网的支撑效果也不好。目前国内移动已经开始推进融合通信,例如新的预装融合通信apk的运营商手机发短信就是和微信一样是走数据流量了,不会再是一条一毛钱了,但是通话这块好像还是没有动静,继续走Volte)。
    技术细节被保留在TeleService或者其他模块后,telecom维护的就是最一般的通信状态,例如不管什么通信方式都会有连接对方的动作(拨号)、结束和对方通信(挂断电话)、对方请求和你通讯(电话来电,响铃等)。TeleService中的phone对象作为一个或者几个账户(一般情况:国内双卡机器就是两个账户,单卡机器一个)登记注册到Telecom模块中,其他的通话方式也可以作为一个账户登记到telecom中,这样用户拨号时候可以选择其它的通信方式通话,苹果的facetime类似于这个理念。例如设想下,微信就可以注册到telecom中(虽然目前好像并没有实现这个),这样和对方通话可以直接选择微信通话电话,不过这要求双方android5.0版本以上手机、联网,类似苹果的imessage理念(要求双方苹果手机、联网且都登录苹果账号,然后发短信会优先选择数据流量)。
    捎带提及的是UI层在5.0后也被分离了出去,代码在packages/apps/InCallUI中(7.0 挪到了Dialer目录下),这样原先5.0之前的一个apk被拆分成了三块:负责通信初始化和通话技术细节维护的Telephony,负责一般通讯状态实现和维护的Telecomm,和通话界面InCallUI;framework由原先4.x(具体小版本号是多少忘记了)之前的frameworks/base/telephony也拆成了三块:telecom框架层代码frameworks/base/telecomm/,三方也用的通讯层(如SignalStrength,状态栏显示信号会用;TelephonyManager,专门给三方用的啊)代码frameworks/base/telephony,通信类apk(如Telephony,Mms,TelephonyProvider)才用的代码frameworks/opt/telephony/
    目前除通信模块相关代码外framework中原本调用phone服务的地方基本都会调用telecomm服务了。和通信模块相关但非通话相关的继续用TelephonyManager,例如获取imei;和通话相关的用TelecomManager就对了,如停止响铃和判断当前是否是incall状态。




    展开全文
  • 实时对电信搅局案例进行Logistic回归研究: 这是一个IPython Notebook,展示了Logistic回归对电信公司的实时搅动数据的有效性。 它探讨了statsmodels和sklearn库提供的Logistic回归的不同实用程序。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,960
精华内容 4,384
关键字:

telecom