{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":1,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#导入常用包\nimport time \nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn import metrics,cross_validation\nimport scikitplot.plotters as skplt\nfrom sklearn.model_selection import StratifiedKFold\n#import matplotlib.pylab as plt\nfrom sklearn.grid_search import GridSearchCV\n%matplotlib inline","execution_count":2,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"08b4e2e2112d7e40a35484a7665395d51e765ccb","_cell_guid":"6e0c0134-ce28-436e-b290-3c7e5ec40e6b","trusted":true},"cell_type":"code","source":"#导入数据\ntrain=pd.read_csv('../input/train.csv',skiprows=160000000,nrows=2000000)\ntest=pd.read_csv('../input/test.csv')","execution_count":3,"outputs":[]},{"metadata":{"_uuid":"e63d1e2a8f0b8bf70141bced36d391a56fb176b7","_cell_guid":"d0ff43c5-02c4-4199-9400-8a690b9fd11f","trusted":true},"cell_type":"code","source":"#处理时间特征\n'''def dataPreProcessTime(df):\n    df['click_time'] = pd.to_datetime(df['click_time']).dt.date\n    df['click_time'] = df['click_time'].apply(lambda x: x.strftime('%Y%m%d')).astype(int)\n    \n    return df'''","execution_count":31,"outputs":[]},{"metadata":{"_uuid":"57f76435477ab8da35045142c333e398da31fb02","_cell_guid":"3b2483a8-3d12-4821-ab45-62244545a35a","trusted":true},"cell_type":"code","source":"#展示数据\ntrain.columns=['ip','app','device','os','channel','click_time','attributed_timed','is_attributed']\nprint(train.head())\nprint('*'*10)\nprint(test.head())","execution_count":4,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"58f09fef77782d1eb8512d1d200a8761c849a966","_cell_guid":"ff4130da-57fe-43a4-9249-05834b8c5478","trusted":false},"cell_type":"code","source":"#处理点击时间\n#train = dataPreProcessTime(train)\n#test = dataPreProcessTime(test)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"aa1f18d3f98813f71bc9e9f95c907b178edaa63e","_cell_guid":"0d35ac78-5a56-45bc-a384-9dfbbc8dca92","trusted":true},"cell_type":"code","source":"print(train.head())\nprint('*'*10)\nprint(test.head())","execution_count":33,"outputs":[]},{"metadata":{"_uuid":"91a678482149c076b4e17412f5d427acc75d2215","_cell_guid":"373522d0-1fa7-4fef-ad09-08361cc3bad9","trusted":true},"cell_type":"code","source":"#数据的统计信息\nprint(train['is_attributed'].value_counts())\nprint(train[train['is_attributed']==1]['is_attributed'].sum()/len(train))","execution_count":5,"outputs":[]},{"metadata":{"_uuid":"e958dbb0d114190c73e0f696c94af19db0c11a0c","_cell_guid":"be5c09eb-5ca3-4a9d-a865-953ef1fdc10c","trusted":true},"cell_type":"code","source":"#不管任何参数，都用默认的，拟合数据看情况\n'''rf0=RandomForestClassifier(oob_score=True,random_state=10,n_jobs=-1)\nrf0.fit(train,y)\nprint(rf0.oob_score_)#输出袋外准确率，泛化能力体现\ny_predprob=rf0.predict_proba(train)[:,1]#预测数据\nprint('AUC Score (Train):%f'% metrics.roc_auc_score(y,y_predprob))\n#0.99715725,AUC Score (Train):0.999454,可见袋外分数已经很(理解为袋外数据作为验证集时的准确率，也就是模型的泛化能力)\n#而且AUC分数也很高（AUC是指从一堆样本中随机抽一个，抽到正样本的概率比抽到负样本的概率 大的可能性）。\n#相对于GBDT的默认参数输出，RF的默认参数拟合效果对本例要好一些。  '''","execution_count":14,"outputs":[]},{"metadata":{"_uuid":"2bda6506b4924ad3f4c8c11bf6295715a216225f","_cell_guid":"0ac78b0a-e4e7-4c0c-b1ae-e0ae697c9a3a","trusted":true},"cell_type":"code","source":"#首先对n_estimators进行网格搜索\n'''param_test1={'n_estimators':[_ for _ in range(10,71,10)]}\n#print(range(10,71,10))\ngsearch1=GridSearchCV(estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',\n                                                       random_state=10),param_grid=param_test1,scoring='roc_auc',cv=5,n_jobs=-1)\ngsearch1.fit(train,y)\nprint(gsearch1.grid_scores_)\nprint('*'*10)\nprint(gsearch1.best_params_)\nprint('*'*10)\nprint(gsearch1.best_score_)'''\n'''\n[mean: 0.91909, std: 0.02009, params: {'n_estimators': 10}, \n mean: 0.92283, std: 0.02591, params: {'n_estimators': 20}, \n mean: 0.93013, std: 0.02157, params: {'n_estimators': 30}, \n mean: 0.92795, std: 0.02175, params: {'n_estimators': 40}, \n mean: 0.92913, std: 0.02274, params: {'n_estimators': 50}, \n mean: 0.93138, std: 0.02290, params: {'n_estimators': 60}, \n mean: 0.93186, std: 0.02317, params: {'n_estimators': 70}]\n**********\n{'n_estimators': 70}\n**********\n0.9318593718982462\n'''","execution_count":11,"outputs":[]},{"metadata":{"_uuid":"0a4f262c0917b23b45f76d1ea58d0ca1892da35c","_cell_guid":"5ec732d6-df84-4053-a4d5-02a3a140d3b1","trusted":true},"cell_type":"code","source":"#上面我们得到最佳的若学习迭代次数，接着我们对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索\n'''param_test2={'max_depth':[_ for _ in range(5,10,2)],'min_samples_split':[_ for _ in range(100,201,50)]}\ngsearch2=GridSearchCV(estimator=RandomForestClassifier(n_estimators=60,min_samples_leaf=20,max_features='sqrt',oob_score=True,\n                                                      random_state=10),param_grid=param_test2,scoring='roc_auc',iid=False,cv=5,n_jobs=-1)\ngsearch2.fit(train,y)\nprint(gsearch2.grid_scores_)\nprint('*'*10)\nprint(gsearch2.best_params_)\nprint('*'*10)\nprint(gsearch2.best_score_)'''\n'''\n[mean: 0.91430, std: 0.02620, params: {'max_depth': 5, 'min_samples_split': 100}, \n mean: 0.91427, std: 0.02509, params: {'max_depth': 5, 'min_samples_split': 150}, \n mean: 0.91513, std: 0.02596, params: {'max_depth': 5, 'min_samples_split': 200}, \n mean: 0.92603, std: 0.02233, params: {'max_depth': 7, 'min_samples_split': 100}, \n mean: 0.92727, std: 0.02562, params: {'max_depth': 7, 'min_samples_split': 150}, \n mean: 0.92734, std: 0.02648, params: {'max_depth': 7, 'min_samples_split': 200}, \n mean: 0.93592, std: 0.02747, params: {'max_depth': 9, 'min_samples_split': 100}, \n mean: 0.92949, std: 0.02930, params: {'max_depth': 9, 'min_samples_split': 150}, \n mean: 0.92710, std: 0.02971, params: {'max_depth': 9, 'min_samples_split': 200}]\n**********\n{'max_depth': 9, 'min_samples_split': 100}\n**********\n0.9359221905382125\n'''","execution_count":12,"outputs":[]},{"metadata":{"_uuid":"080bcd001d961db9842ded3aaf82cd3b9a247b48","_cell_guid":"1388edf5-5a8a-4071-add5-a185a0e8c29e","trusted":true},"cell_type":"code","source":"#已经取了三个最优参数，看看现在模型的袋外分数：  \n#rf1= RandomForestClassifier(n_estimators= 60, max_depth=9, min_samples_split=100,  \n#                                 min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10,n_jobs=-1)  \n#rf1.fit(train,y)  \n#print (rf1.oob_score_)#0.99808","execution_count":13,"outputs":[]},{"metadata":{"_uuid":"5937ec5a6ec3e5a79dd52c1aa8500be33d5072d7","_cell_guid":"1b3508d4-3593-45e9-a320-59028438bc6d","trusted":true},"cell_type":"code","source":"#再对 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参\n'''param_test3={'min_samples_split':[_ for _ in range(80,150,20)],'min_samples_leaf':[_ for _ in range(10,60,10)]}\ngsearch3=GridSearchCV(estimator=RandomForestClassifier(n_estimators=60,max_depth=9,max_features='sqrt',oob_score=True,\n                                                      random_state=10),param_grid=param_test3,scoring='roc_auc',iid=False,cv=5,n_jobs=-1)\ngsearch3.fit(train,y)\nprint(gsearch3.grid_scores_)\nprint('*'*10)\nprint(gsearch3.best_params_)\nprint('*'*10)\nprint(gsearch3.best_score_)\n\n[mean: 0.93066, std: 0.02593, params: {'min_samples_leaf': 10, 'min_samples_split': 80}, \n mean: 0.93430, std: 0.02091, params: {'min_samples_leaf': 10, 'min_samples_split': 100}, \n mean: 0.93530, std: 0.02702, params: {'min_samples_leaf': 10, 'min_samples_split': 120}, \n mean: 0.93467, std: 0.02722, params: {'min_samples_leaf': 10, 'min_samples_split': 140}, \n mean: 0.92919, std: 0.02519, params: {'min_samples_leaf': 20, 'min_samples_split': 80}, \n mean: 0.93592, std: 0.02747, params: {'min_samples_leaf': 20, 'min_samples_split': 100}, \n mean: 0.93484, std: 0.02911, params: {'min_samples_leaf': 20, 'min_samples_split': 120}, \n mean: 0.93036, std: 0.02831, params: {'min_samples_leaf': 20, 'min_samples_split': 140}, \n mean: 0.92417, std: 0.02707, params: {'min_samples_leaf': 30, 'min_samples_split': 80}, \n mean: 0.93252, std: 0.02691, params: {'min_samples_leaf': 30, 'min_samples_split': 100}, \n mean: 0.93242, std: 0.02767, params: {'min_samples_leaf': 30, 'min_samples_split': 120}, \n mean: 0.92836, std: 0.02894, params: {'min_samples_leaf': 30, 'min_samples_split': 140}, \n mean: 0.92965, std: 0.02582, params: {'min_samples_leaf': 40, 'min_samples_split': 80}, \n mean: 0.92826, std: 0.02807, params: {'min_samples_leaf': 40, 'min_samples_split': 100}, \n mean: 0.92696, std: 0.03264, params: {'min_samples_leaf': 40, 'min_samples_split': 120}, \n mean: 0.92515, std: 0.03103, params: {'min_samples_leaf': 40, 'min_samples_split': 140}, \n mean: 0.92452, std: 0.02529, params: {'min_samples_leaf': 50, 'min_samples_split': 80}, \n mean: 0.92452, std: 0.02529, params: {'min_samples_leaf': 50, 'min_samples_split': 100}, \n mean: 0.92206, std: 0.03576, params: {'min_samples_leaf': 50, 'min_samples_split': 120}, \n mean: 0.92221, std: 0.03479, params: {'min_samples_leaf': 50, 'min_samples_split': 140}]\n**********\n{'min_samples_leaf': 20, 'min_samples_split': 100}\n**********\n0.9359221905382125\n'''","execution_count":16,"outputs":[]},{"metadata":{"_uuid":"52d4efb8f8baae13d1a45c5a8e65ef88aae73e03","_cell_guid":"15a8688c-c165-400e-a38b-91eb759c9092","trusted":true},"cell_type":"code","source":"#最后，我们对max_features进行调参\n'''param_test4={'max_features':[_ for _ in range(2,6,1)]}\ngsearch4=GridSearchCV(estimator=RandomForestClassifier(n_estimators=60,max_depth=9,min_samples_split=100,min_samples_leaf=20,\n                                        oob_score=True,random_state=10),param_grid=param_test4,scoring='roc_auc',iid=False,cv=5,n_jobs=-1)\ngsearch4.fit(train,y)\nprint(gsearch4.grid_scores_)\nprint('*'*10)\nprint(gsearch4.best_params_)\nprint('*'*10)\nprint(gsearch4.best_score_)\n\n[mean: 0.93592, std: 0.02747, params: {'max_features': 2}, \n mean: 0.92505, std: 0.02320, params: {'max_features': 3}, \n mean: 0.92823, std: 0.01968, params: {'max_features': 4}, \n mean: 0.91520, std: 0.02424, params: {'max_features': 5}]\n**********\n{'max_features': 2}\n**********\n0.9359221905382125\n'''","execution_count":19,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"d5297211030465007cc79a65941adef828b4a3f0","_cell_guid":"3d336451-80cc-4f29-aa70-10dedf7844b1","trusted":false},"cell_type":"code","source":"#查看缺失值有多少\n'''print(train.isnull().sum())\nprint('*'*10)\nprint(test.isnull().sum())'''","execution_count":null,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"720646abb29a5328f7d355a20f8ea08891cb52c0","_cell_guid":"6a2ed925-d8be-4c36-aeaa-c978f34562bf","trusted":false},"cell_type":"code","source":"#查看不一样的非空值有多少\n'''cols=['ip','app','device','os','channel']\nuniques_train={col:train[col].nunique() for col in cols}\nprint('Train:Unique Values')\nuniques_train'''","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"0943a3590b351db1255e781f23ccd968e668b50c","_cell_guid":"3545b6f3-0c4d-43e4-b77b-1effbcf40339","trusted":true},"cell_type":"code","source":"'''uniques_test={col:test[col].nunique() for col in cols}\nprint('Test:Unique Values')\nuniques_test'''","execution_count":26,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"5fc9c1828ede2e937c40238bb1d961af1976df49","_cell_guid":"f87f7e00-eed8-4f93-9113-0215382dcfb0","trusted":true},"cell_type":"code","source":"y=train['is_attributed']\n#'click_time','is_attributed','attributed_timed'\ntrain.drop(['click_time','is_attributed','attributed_timed'],axis=1,inplace=True)#inplace=True代表更改原内存的值\n#'click_id','click_time'\ntest.drop(['click_id','click_time'],axis=1,inplace=True)","execution_count":6,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"5dd57c7a35314b971aab96d4d66a1e70650cc67d","_cell_guid":"5d8f4362-3a63-42c2-b042-35039271a839","trusted":true},"cell_type":"code","source":"#不包含时间\n#train.drop(['click_time'],axis=1,inplace=True)\n#test.drop(['click_time'],axis=1,inplace=True)","execution_count":7,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"4843311b914830726744c9438405d5e057947066","_cell_guid":"c9790121-8aba-4653-a4f3-9b3dcae9b5b3","trusted":true},"cell_type":"code","source":"def print_score(m,dt,y):\n    print('Accuracy:[Train,Val]')\n    res=[m.score(dt,y)]#验证得分\n    if hasattr(m,'obb_score_'):res.append(m.obb_score_)#袋外验证得分\n    print(res)\n    \n    print('Train Confusion Matrix')\n    df_train_proba=m.predict_proba(dt)#预测概率，原始的值\n    df_train_pre_indices=np.argmax(df_train_proba,axis=1)#找到每一行概率最大值的索引\n    print(df_train_pre_indices)\n    classes_train=np.unique(y)#类别个数\n    preds_train=classes_train[df_train_pre_indices]\n    print('*'*10)\n    print(preds_train)\n    skplt.plot_confusion_matrix(y,preds_train)","execution_count":7,"outputs":[]},{"metadata":{"_uuid":"51a8830a9e98685d1d2b0cb2443bc1ee5a65c7c3","_cell_guid":"69bbd248-2d0d-48e8-a197-e18ee8b3c92c","trusted":true},"cell_type":"code","source":"#提交数据集的模板\ntest_submission = pd.read_csv(\"../input/sample_submission.csv\")\ntest_submission.head()","execution_count":8,"outputs":[]},{"metadata":{"_uuid":"189e79114b6ce80a1b923255c293540d670e00ec","_cell_guid":"2b839720-dbe9-4e9e-85c4-b232355aa778","trusted":true},"cell_type":"code","source":"#建立模型开始训练\n#rfm=RandomForestClassifier(n_estimators=12,max_depth=6,min_samples_leaf=100,max_features=0.5,bootstrap=False,n_jobs=-1,random_state=123)\n#%time rfm.fit(train,y)\n#用我们搜索到的最佳参数，我们再看看最终的模型拟合\nrf2=RandomForestClassifier(n_estimators=15,max_depth=9,min_samples_split=100,min_samples_leaf=20,max_features=2,\n                           oob_score=True,random_state=10,n_jobs=-1)\nrf2.fit(train,y)\nprint(rf2.oob_score_)#0.99808","execution_count":9,"outputs":[]},{"metadata":{"_uuid":"167a6d43ba66faed8de4a2bd6236f86c90c17a2d","_cell_guid":"597725e4-d32a-4f33-bb83-1c164aff8e0c","trusted":true},"cell_type":"code","source":"#计算准确率，交叉验证法\nimport scikitplot.plotters as skplt\n#print_score(rfm,train,y)#[0.99808]\nprint_score(rf2,train,y)#[0.99808]","execution_count":11,"outputs":[]},{"metadata":{"_uuid":"893a9ab79151ca5ddd3f8b3a1b9723e8a5d5e8c5","_cell_guid":"c924810c-9227-465e-811f-49fb87229499","trusted":true},"cell_type":"code","source":"#查看训练各个特征的权重\ncols=train.columns\nIml=rf2.feature_importances_\nfeature_imp_dict = {}\nfor i in range(len(cols)):\n    feature_imp_dict[cols[i]]=Iml[i]\nprint(feature_imp_dict)","execution_count":13,"outputs":[]},{"metadata":{"_uuid":"f5cbcdd4038536c821732ce9d6527b31ae525fd1","_cell_guid":"b6e2ddc3-4a0b-41c7-9186-c45dba0af696","trusted":true},"cell_type":"code","source":"#预测值\ny_pred=rf2.predict_proba(test)\ntest_submission['is_attributed']=y_pred[:,1]\ntest_submission.head()\n","execution_count":14,"outputs":[]},{"metadata":{"_uuid":"8abc9b582cdfe02e66a63e19894b2135d2faf345","_cell_guid":"6282c808-7ad0-4106-b220-60988e67543d","trusted":true},"cell_type":"code","source":"test_submission.head(30)","execution_count":15,"outputs":[]},{"metadata":{"_uuid":"8dcb2179014cc2821eafa501e87231e98e918062","_cell_guid":"62ee5843-9782-493c-9b34-b1f4297784d5","trusted":true},"cell_type":"code","source":"test_submission['is_attributed'].sum()","execution_count":16,"outputs":[]},{"metadata":{"collapsed":true,"_uuid":"d246591df66496110d62e8bbd41c94b5f7b6019d","_cell_guid":"52f3f84f-021f-4e3c-a6f1-7d2c3c4194c0","trusted":false},"cell_type":"code","source":"#保存结果\ntest_submission.to_csv('rf3_result.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}