{"cells":[{"metadata":{"_uuid":"1efa9c9661f7197f394457ea9a98b386caf64b8a"},"cell_type":"markdown","source":"# Microsoft Malware Prediction - pipeline with some new features"},{"metadata":{"trusted":true,"_uuid":"440b5379c34a5f169fad9b746cfa9cdbddc84d00"},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom matplotlib import pylab as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e9aaa21d77499377064f3d155a00a2f320487b44"},"cell_type":"code","source":"import gc\nimport time\nfrom datetime import datetime\nimport warnings\nwarnings.simplefilter(action = 'ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7430ec4ff729697d8e3431e0d657f0d55ccafbaf"},"cell_type":"code","source":"from sklearn.metrics import roc_auc_score, log_loss, accuracy_score, confusion_matrix\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.cluster import KMeans","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"95bc4c3c0d6078b4fbf7ad49ad8f1720c9fb6a50"},"cell_type":"code","source":"import lightgbm as lgbm","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"161bbb41f613921c861961585b177a828fc15f81"},"cell_type":"markdown","source":"## Functions"},{"metadata":{"_uuid":"bf1a568f5a350314cb92d1da07824e9a3e48eeb8"},"cell_type":"markdown","source":"### for memory saving"},{"metadata":{"trusted":true,"_uuid":"3f0153dd3d37d97f429ad1f0c44a2ceb151d561c"},"cell_type":"code","source":"def reduce_mem_usage(df_, max_reduce = True):\n    start_mem = df_.memory_usage().sum() / 1024**2\n    print('Memory usage of dataframe: {:.2f} MB'.format(start_mem))\n    \n    for c in df_.columns[df_.dtypes != 'object']:\n        col_type = df_[c].dtype\n        \n        c_min = df_[c].min()\n        c_max = df_[c].max()\n        if str(col_type)[:3] == 'int':\n            if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                df_[c] = df_[c].astype(np.int8)\n            elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                df_[c] = df_[c].astype(np.int16)\n            elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                df_[c] = df_[c].astype(np.int32)\n            else:\n                df_[c] = df_[c].astype(np.int64)  \n        else:\n            if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max and max_reduce:\n                df_[c] = df_[c].astype(np.float16)\n            elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                df_[c] = df_[c].astype(np.float32)\n            else:\n                df_[c] = df_[c].astype(np.float64)\n\n    end_mem = df_.memory_usage().sum() / 1024**2\n    print('Memory usage after optimization: {:.2f} MB'.format(end_mem))\n    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n    \n    return df_","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8dfbe0ef793c809e496c88f7233a866cd4660146"},"cell_type":"markdown","source":"### for data converting"},{"metadata":{"trusted":true,"_uuid":"0b5763a2b35b829a80f0427cdcf6eee87fc31a6e"},"cell_type":"code","source":"def new_features_from_version(df_, feature_, target_):\n    \n    def version_to_int(value):\n        format_mask = ['{:0>2}', '{:0>3}', '{:0>5}', '{:0>5}']\n        new_value = [f.format(v) for f, v in zip(format_mask, str(value).split('.'))]\n        return int(new_value[0] + new_value[1] + new_value[2] + new_value[3])\n    \n    def split_column(df_, feature_, sep):\n        res = pd.DataFrame.from_records(list(df_[feature_].astype('object').apply(lambda x: tuple(str(x).split(sep))).values),\n                                        index = df_.index)\n        res.columns = [feature_ + '_' + str(c) for c in res.columns]\n        return res\n\n    new_features = pd.DataFrame(index = df_.index)\n    \n    # convert version into numerical representation\n    new_features[feature_ + '_int'] = df_[feature_].apply(version_to_int).astype(int)\n    new_features[feature_ + '_int'] -= new_features[feature_ + '_int'].min() # for reduce memory\n    \n    # frequencies encoding    \n    new_features[feature_ + '_frq'] = df_[feature_].map(df_[feature_].value_counts())\n    \n    # split version\n    split = split_column(df_, feature_, '.')\n    split['target'] = target_\n    \n    # features from major, minor, build, revision if it has sense\n    nun = split.nunique(dropna = False)\n    if sum(nun < 2) > 0:\n        to_drop = list(split.columns[nun < 2])\n        split.drop(to_drop, axis = 1, inplace = True)\n\n    # target encoding for risk zones\n    to_drop = []\n    for c in split.columns.drop('target'):\n        if split[c].value_counts(dropna = False).iloc[1] < 100000:\n            to_drop.append(c)\n        else:\n            new_features[c] = split[c].astype(int)\n    split.drop(to_drop, axis = 1, inplace = True)\n    \n    for c in split.columns.drop('target'):\n        te = split.groupby([c])['target'].transform(np.mean)\n        split[c + '_good'] = -(te <= .4).astype(int)\n        split[c + '_bad'] =  (te >= .6).astype(int)\n        \n    # risk zones feature \n    new_features[feature_ + '_risk'] = split.drop('target', axis = 1).sum(axis = 1)\n    \n    new_features = reduce_mem_usage(new_features)\n    \n    return new_features","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ac7a5f1a5448da1746cb35ae0b376bb0e44ece63"},"cell_type":"markdown","source":"### for fast checking & cross-validation"},{"metadata":{"trusted":true,"_uuid":"98475459e059544d3425c0a8f8b3a05d401cae13"},"cell_type":"code","source":"def lgbm_fast_check(df_, target_, params_):\n    \n    params = params_.copy()\n    params['metric'] = 'auc'\n\n    train_data = lgbm.Dataset(data = df_, label = target_)\n    clf = lgbm.train(params, \n                     train_set = train_data, valid_sets = [train_data], \n                     num_boost_round = 100, verbose_eval = 10, keep_training_booster = True)\n        \n    pred = clf.predict(df_)\n    \n    importances = pd.DataFrame(index = df_.columns)\n    importances['cnt'] = pd.Series(clf.feature_importance(), index = df_.columns)\n    importances['gain'] = pd.Series(clf.feature_importance(importance_type = 'gain'), index = df_.columns)\n    importances.fillna(0, inplace = True)\n    \n    return importances, \\\n           [roc_auc_score(target_, pred), log_loss(target_, pred), accuracy_score(target_, (pred >= .5) * 1)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7a93bae0a25c657c1100982581eecba3a6cf9445"},"cell_type":"code","source":"def lgbm_cross_validation(df_, target_, params_,\n                          num_boost_round = 20000, early_stopping_rounds = 200,\n                          model_prefix = '',\n                          num_folds = 3, rs = 0, verbose = 100):\n    \n    print(params_)\n    \n    clfs = []\n    importances_cnt = pd.DataFrame(index = df_.columns)\n    importances_gain = pd.DataFrame(index = df_.columns)\n    folds = StratifiedKFold(n_splits = num_folds, shuffle = True, random_state = rs)\n    \n    valid_pred = np.zeros(df_.shape[0])\n    \n    # Cross-validation cycle\n    for n_fold, (train_idx, valid_idx) in enumerate(folds.split(target_, target_)):\n        print('--- Fold {} started at {}'.format(n_fold, time.ctime()))\n        \n        train_x, train_y = df_.iloc[train_idx], target_.iloc[train_idx]\n        valid_x, valid_y = df_.iloc[valid_idx], target_.iloc[valid_idx]\n    \n        train_data = lgbm.Dataset(data = train_x, label = train_y)\n        valid_data = lgbm.Dataset(data = valid_x, label = valid_y, reference = train_data)\n        \n        clf = lgbm.train(params_, \n                         train_set = train_data, valid_sets = [train_data, valid_data], \n                         num_boost_round = num_boost_round, early_stopping_rounds = early_stopping_rounds, \n                         verbose_eval = verbose, keep_training_booster = True)\n        \n        clfs.append(clf)\n        if len(model_prefix) > 0:\n            clf.save_model(model_prefix + str(n_fold) + '.txt')\n\n        valid_pred[valid_idx] = clf.predict(valid_x)\n    \n        valid_score = valid_pred[valid_idx]\n        tn, fp, fn, tp = confusion_matrix(valid_y, (valid_score >= .5) * 1).ravel()\n        ras = roc_auc_score(valid_y, valid_score)\n        acc = accuracy_score(valid_y, (valid_score >= .5) * 1)\n        loss = log_loss(valid_y, valid_score)\n        print('--- Final valid score for this fold ---')\n        print('TN =', tn, 'FN =', fn, 'FP =', fp, 'TP =', tp)\n        print('AUC = ', ras, 'Loss =', loss, 'Acc =', acc)\n        print('-'*40)\n\n        importances_cnt[n_fold] = pd.Series(clf.feature_importance(), index = df_.columns)\n        importances_gain[n_fold] = pd.Series(clf.feature_importance(importance_type = 'gain'), \n                                             index = df_.columns)\n        \n        del train_x, train_y, valid_x, valid_y, train_data, valid_data, valid_score\n        gc.collect()\n\n    importances = pd.DataFrame(index = df_.columns)\n    importances['cnt'] = importances_cnt.mean(axis = 1)\n    importances['gain'] = importances_gain.mean(axis = 1)\n    importances.fillna(0, inplace = True)\n    \n    return clfs, valid_pred, importances","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ad8a5cbc504268c2552f7109cdf9625186136d6f"},"cell_type":"code","source":"parameters = {}\nparameters['device'] = 'cpu'\nparameters['objective'] = 'binary'\nparameters['n_jobs'] = -1\nparameters['boosting'] = 'gbdt'\nparameters['two_round'] = True\nparameters['learning_rate'] = .05           # default = 0.1\nparameters['feature_fraction'] = .8         # default = 1.\nparameters['bagging_freq'] = 1              # default = 0\nparameters['bagging_fraction'] = .3         # default = 1.\nparameters['max_depth'] = -1                # default = -1 \nparameters['num_leaves'] = 20               # default = 31 \nparameters['max_bin'] = 1024                # default = 255, bigger is only for CPU!\nparameters['min_data_in_leaf'] = 100        # default = 20\nparameters['lambda_l1'] = 100.              # default = 0\nparameters['lambda_l2'] = 100.              # default = 0\nparameters['random_seed'] = 0","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"fb62a4528ad60025da5c98aef5ebb8935f57b87c"},"cell_type":"markdown","source":"## Load source train & test sets"},{"metadata":{"trusted":true,"_uuid":"ad695e946166be2fed2ba3915de61f73187840bf"},"cell_type":"code","source":"protection_features = [\n    'HasTpm',\n    'ProductName',\n    'AVProductStatesIdentifier', \n    'AVProductsInstalled', \n    'AVProductsEnabled',\n    'IsProtected', \n    'SMode', \n    'SmartScreen', \n    'Firewall',\n    'UacLuaenable',\n    'Census_IsSecureBootEnabled'\n]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"753be8a37477b2cd384f3322570e341ba93642fb"},"cell_type":"code","source":"version_num_features = ['AvSigVersion'] # only one for Kaggle kernel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9639fb5dc16ed9243b7c870f1b67cf48eb0577aa"},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv', \n                    usecols = ['MachineIdentifier', 'HasDetections'] + protection_features + version_num_features)\ntrain.drop(5244810, inplace = True) #bad AvSigVersion value\ntrain.set_index('MachineIdentifier', inplace = True)\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6b526fbfd22a8f35b71c98e390bcce99720ab595"},"cell_type":"code","source":"target_train = train['HasDetections']\ntrain.drop('HasDetections', axis = 1, inplace = True)\ntarget_train.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3fc37b9adc930ef5869290a55a3217134ec4d353"},"cell_type":"code","source":"test = pd.read_csv('../input/test.csv', \n                   usecols = ['MachineIdentifier'] + protection_features + version_num_features)\ntest.set_index('MachineIdentifier', inplace = True)\ntest.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21f3776e0f2e7ae7cdf6a746fcc6f95f1698dbbb"},"cell_type":"code","source":"index_train = list(train.index)\nindex_test = list(test.index)\nprint(len(index_train), len(index_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f82954e8e96655c2c043a7ae2a8a60f77fd8fee3"},"cell_type":"code","source":"df_full = pd.concat([train, test], axis = 0)\ndf_full = reduce_mem_usage(df_full)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"660ad33a68cd46b5cf7c22b7b7f51d39cb108fdf"},"cell_type":"code","source":"del train, test\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a69211a6503d41bea4f17ebeb866f62561de6199"},"cell_type":"code","source":"for c in df_full.columns:\n    if df_full[c].dtypes == 'object':\n        df_full[c] = df_full[c].astype('category')\n        \ndf_full.info(null_counts = True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"46e541c13802e7334cd53b446ff325325beb969b"},"cell_type":"markdown","source":"### Fast check for comparing scores"},{"metadata":{"trusted":true,"_uuid":"10ab13f42048adf41d912d63b4616c20ca6e1d5d"},"cell_type":"code","source":"scores = pd.DataFrame(index = ['AUC', 'LogLoss', 'Accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6cbf00393b9666e10ead739fbb1fa57b92bf583b"},"cell_type":"code","source":"imp, sc = lgbm_fast_check(df_full.loc[index_train], target_train, parameters)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fb4d01fb14ed553bf9c6f82b585b9b5d2ec945ef"},"cell_type":"code","source":"scores['Source'] = sc\nscores","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"acce681c984af52da94447b32ced5208efd54fb3"},"cell_type":"code","source":"imp.sort_values('gain', ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21c95a78e6f52add82e990a925b3f7938ee700a4"},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6439f691bdb202e2b8e61eca0bdc3bb7fcbbc772"},"cell_type":"markdown","source":"## New features "},{"metadata":{"trusted":true,"_uuid":"1ee8300d8044bcc13af8353ec743655a95111b72"},"cell_type":"code","source":"df_new = pd.DataFrame(index = df_full.index)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d88460abfbca725d23661d81fed7c18e731d31ef"},"cell_type":"markdown","source":"### from versions"},{"metadata":{"trusted":true,"_uuid":"7fe2455706d3a14aae819e8f0443443dd24669b4","scrolled":true},"cell_type":"code","source":"for c in version_num_features:\n    print(c, time.ctime())\n    df_new = pd.concat([df_new, new_features_from_version(df_full, c, target_train)], axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c300406950cc5b5c72553c1646894e5284398c17"},"cell_type":"code","source":"df_new.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3a9ff389fe4c9ea57887ff0da91182318e6df98f"},"cell_type":"code","source":"df_full = pd.concat([df_full, df_new], axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dbba1af732130226ece0a60dd404cdc5848742cf"},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"62f1948a28311b185cf8ef1c2571436a0b1ddf45"},"cell_type":"markdown","source":"### cluster features"},{"metadata":{"trusted":true,"_uuid":"31cb9eaeeec5f7e83af8e4f73de244ad5b9d834f"},"cell_type":"code","source":"df_new.fillna(df_new.mean(axis = 0), inplace = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"111b741b060f39376d7ff8c310233c4a21316cb1","scrolled":true},"cell_type":"code","source":"clusters = KMeans(n_clusters = 3, random_state = 0, n_jobs = -1)\nclusters.fit(df_new.loc[index_train])\ncenters = clusters.cluster_centers_","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"51f4acfbfb85c58d4ad8d05e94f0921140bff984"},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ed85bd54dd0539358e6588c0d3be899e25259b21"},"cell_type":"code","source":"columns = df_new.columns\nclust_features = pd.DataFrame(index = df_new.index)\nfor i in range(len(centers)):\n    print(i, time.ctime())\n    # distance as manhattan metric\n    clust_features['clust_dist_' + str(i)] = (df_new[columns] - centers[i]).applymap(abs).apply(sum, axis = 1)\n    \nclust_features.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9d4a6033c21249d12c46ea603ae8fa8f5967520f"},"cell_type":"code","source":"del df_new\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dca58c7a44a7c53da82cfcf7cb6d1a15db45fabd"},"cell_type":"code","source":"clust_features = reduce_mem_usage(clust_features)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"05731e6f1996d4984f55e1c88387c96f695dc0ea"},"cell_type":"code","source":"df_full = pd.concat([df_full, clust_features], axis = 1)\ndf_full.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5ccc4121416bc1f7203980dbea4098696d3c57a7"},"cell_type":"code","source":"del clust_features\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3259aaa74293c01855d4b1d39811c4c5065cdda9"},"cell_type":"code","source":"df_full.info(null_counts = True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"043f705c306f9a2804e5b9bf5081b9ac53f9ef83"},"cell_type":"markdown","source":"### Fast check for comparing scores"},{"metadata":{"trusted":true,"_uuid":"8ca225e9911693256cd58e65912289ebf58f96e5"},"cell_type":"code","source":"imp, sc = lgbm_fast_check(df_full.loc[index_train], target_train, parameters)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b0d7aeb1e07a2951293d0248a4f9866618385c35"},"cell_type":"code","source":"scores['New'] = sc\nscores","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6db1f712fdcc6d22102751f493700ca6921a9c7c"},"cell_type":"code","source":"imp.sort_values('gain', ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"afe6df8ba55ef3dac5c5d12e5dca707f65a5637e"},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7120606d25373dc74d64f024a2e29e870f1a739e"},"cell_type":"markdown","source":"## Cross-validation"},{"metadata":{"trusted":true,"_uuid":"63007982b933e2892af20ecc540f0c94c5cbea11"},"cell_type":"code","source":"scores = pd.DataFrame(index = ['auc', 'acc', 'loss', 'tn', 'fn', 'fp', 'tp'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6c2c5ad05468f8f72bde246283907f5851eaecf0","scrolled":true},"cell_type":"code","source":"clfs, valid_pred, importances = lgbm_cross_validation(df_full.loc[index_train], target_train, parameters)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"08e9c1a6f7ad7ca8d1e60738c4e027e65a6e8eba"},"cell_type":"code","source":"importances.sort_values('gain', ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c1798a8428f35cb9c8508a1e38c5607ee8892c3f"},"cell_type":"code","source":"train_pred = pd.DataFrame(index = index_train)\ntrain_pred['valid'] = valid_pred\ntrain_pred['target'] = target_train\n\ntrain_pred.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b5eee69949f3b260b53be143843a8c825f58ee35"},"cell_type":"code","source":"tn, fp, fn, tp = confusion_matrix(target_train, (train_pred['valid'] >= .5) * 1).ravel()\nscores['train valid'] = [roc_auc_score(target_train, train_pred['valid']), \n                         accuracy_score(target_train, (train_pred['valid'] >= .5) * 1), \n                         log_loss(target_train, train_pred['valid']),\n                         tn, fn, fp, tp]\n    \nscores = scores.T\nscores","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8630f5fca0bf4cf671722ae9b392d212425e3eca"},"cell_type":"code","source":"score_auc = scores.loc['train valid', 'auc']\nscore_acc = scores.loc['train valid', 'acc']\nprint(score_auc, score_acc)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1b82cab756af01d741845d33c256af8125575996"},"cell_type":"markdown","source":"## Test prediction & submit"},{"metadata":{"trusted":true,"_uuid":"f38e16fe4c8c2ebe65f7b626d940bd6bad714cec"},"cell_type":"code","source":"df_full = df_full.loc[index_test]\ndel train_pred, target_train\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"97bb052044d23abc9b2200331aeabd6fdadad368"},"cell_type":"code","source":"test_pred = pd.DataFrame(index = index_test)\n\nfor i, clf in enumerate(clfs):\n    print(i, time.ctime())\n    test_pred[i] = clf.predict(df_full)\n    \ntest_pred['mean'] = test_pred.mean(axis = 1)\ntest_pred.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1e730389c5b39bc434999cc31df54bdf204d53b7"},"cell_type":"code","source":"col = 'mean'\nsubmit = test_pred[col].reset_index()\nsubmit.columns = ['MachineIdentifier', 'HasDetections']\nsubmit.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0e82b1cdb4eae33c2e2372a2ef345fa095ed516e"},"cell_type":"code","source":"filename = 'subm_lgbm_{:.4f}_{:.4f}_{}fold_{}.csv'.format(score_auc, score_acc, len(clfs), \n                                                          datetime.now().strftime('%Y-%m-%d'))\nprint(filename)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"869930d386601ed3f93f9798ae66780ba91544e8"},"cell_type":"code","source":"submit.to_csv(filename, index = False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}