{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"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\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 read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-15T11:14:26.456756Z","iopub.execute_input":"2022-07-15T11:14:26.458220Z","iopub.status.idle":"2022-07-15T11:14:26.490614Z","shell.execute_reply.started":"2022-07-15T11:14:26.458044Z","shell.execute_reply":"2022-07-15T11:14:26.489821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC\nimport tensorflow as tf\nimport random\nimport scipy.stats as stats\nimport os\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom sklearn.model_selection import KFold\nimport lightgbm as lgb\nfrom sklearn.metrics import accuracy_score\n\n# 乱数を固定\ntf.random.set_seed(0)\nnp.random.seed(0)\nrandom.seed(0)\nos.environ[\"PYTHONHASHSEED\"] = \"0\"\n\n\ntrain_df = pd.read_csv('/kaggle/input/titanic/train.csv')\ntest_df = pd.read_csv('/kaggle/input/titanic/test.csv')\nsample_sub = pd.read_csv('/kaggle/input/titanic/gender_submission.csv')\n\nall_df = pd.concat([train_df,test_df],axis=0).reset_index(drop=True)\nall_df['Test_Flag'] = 0\nall_df.loc[train_df.shape[0]: , 'Test_Flag'] = 1\n\nall_df['Age'] =  all_df['Age'].fillna( all_df['Age'].median())\nall_df['Fare'] =  all_df['Fare'].fillna( all_df['Fare'].median())\nall_df['Embarked'] =  all_df['Embarked'].fillna('NaN')\n\nall_df['FareBand'] = pd.qcut(all_df['Fare'], 4)\nall_df['AgeBand'] = pd.qcut(all_df['Age'], 4)\n\nall_df['FamilySize'] = all_df['SibSp'] + all_df['Parch'] + 1\nall_df['MedF']   = all_df['FamilySize'].map(lambda s: 1 if 2 <= s <= 4 else 0)\nall_df['LargeF'] = all_df['FamilySize'].map(lambda s: 1 if s >= 5 else 0)\nall_df['Alone'] = all_df['FamilySize'].map(lambda s: 1 if  s == 1  else 0)\n\n# 敬称を抽出\nall_df['Title'] = all_df.Name.str.extract(' ([A-Za-z]+)\\.', expand=False)\n# 敬称を該当するカテゴリに変換する関数を定義\ndef prepro_name_title(Title): \n    if Title == 'Master':\n        return 0\n    elif Title == 'Miss':\n        return 1\n    elif Title == 'Mr':\n        return 2\n    elif Title == 'Mrs':\n        return 3 \n    else:\n        return 4\n\n# Titelをカテゴリカル変数化\nall_df['Title_Encode'] = all_df['Title'].map(prepro_name_title)\n\nall_df['Title'] = all_df.Name.str.extract(' ([A-Za-z]+)\\.', expand=False)\nall_df['Title_Encode'] = all_df['Title'].map(prepro_name_title)\n\n\nall_df = pd.get_dummies(all_df, columns= [\"Sex\", \"Pclass\"])\nall_df = pd.get_dummies(all_df, columns=['AgeBand','FareBand','Embarked'])\n\ntrain = all_df[all_df['Test_Flag']==0]\ntest = all_df[all_df['Test_Flag']==1].reset_index(drop=True)\ntarget = train['Survived']\n\ndrop_col = [\n    'PassengerId','Age',\n    'Ticket','Title',\n    'Fare','Cabin',\n    'Test_Flag','Name','Survived'\n    ]\n\ntrain = train.drop(drop_col, axis=1)\ntest = test.drop(drop_col, axis=1)\n\ncv = KFold(n_splits=3, random_state=0, shuffle=True)\n\ntrain_acc_list = []\nval_acc_list = []\nmodels_lgb = []\nmodels_rf = []\nmodels_rogi = []\nmodels_svm = []\n\n# ハイパーパラメータを定義　\nlgb_params = {\n    \"objective\":\"binary\",\n    \"metric\": \"binary_error\",\n    \"force_row_wise\" : True,\n    \"seed\" : 0,\n    'learning_rate': 0.1,\n    'min_data_in_leaf': 5,\n    'max_depth': 16\n    }\n\n# LightGBMがカラム名に[]や{}を含んでいるとエラーが出るので、変更する\nrename_dict = {\n    'AgeBand_(0.169, 22.0]' : 'AgeBand_1',\n    'AgeBand_(22.0, 28.0]' : 'AgeBand_2', \n    'AgeBand_(28.0, 35.0]' : 'AgeBand_3', \n    'AgeBand_(35.0, 80.0]' : 'AgeBand_4',\n    'FareBand_(-0.001, 7.896]' : 'FareBand_1', \n    'FareBand_(7.896, 14.454]' : 'FareBand_2',\n    'FareBand_(14.454, 31.275]' : 'FareBand_3',\n    'FareBand_(31.275, 512.329]' : 'FareBand_4'\n    }\n\n\nfor i ,(trn_index, val_index) in enumerate(cv.split(train, target)):\n    \n    print(f'Fold : {i}')\n    X_train ,X_val = train.loc[trn_index].rename( columns =rename_dict), train.loc[val_index].rename( columns =rename_dict)\n    y_train ,y_val = target[trn_index], target[val_index]\n    \n    # LigthGBM Part\n    lgb_train = lgb.Dataset(X_train, y_train)\n    lgb_valid = lgb.Dataset(X_val, y_val)\n    \n        \n    # こちらにverbose_evalを記述 ★篠崎先生アドバイス\n    #verbose_eval = 1\n    verbose_eval = 0  # この数字を1にすると学習時のスコア推移がコマンドライン表示される\n    #verbose_eval=-1  # ログを最後の1つだけ表示\n    \n    model_lgb = lgb.train(\n        params = lgb_params, \n        train_set = lgb_train,\n        valid_sets = [lgb_train, lgb_valid],\n        callbacks=[lgb.early_stopping(stopping_rounds=10,\n                                      verbose=True),\n                   lgb.log_evaluation(verbose_eval)]\n    )\n\n    \n    models_lgb.append(model_lgb)\n    \n    # RandomForest Part\n    print('-' *10 +' Start_rf ' +'-' *10)\n    model_rf = RandomForestClassifier(\n        random_state=0,max_depth=15,\n        min_samples_leaf=5,min_samples_split=5\n        )\n    model_rf.fit(\n        X_train, y_train\n        )\n    models_rf.append(model_rf)\n    \n    # MLP Part\n    print('-' *10 +' Start_mlp ' +'-' *10)\n    \n    # MLP用にLabel-EncodingをOne-Hot Encodingに変換\n    train_pre = pd.get_dummies(train, columns= ['Title_Encode'])\n    X_train_mlp ,X_val_mlp = train_pre.loc[trn_index].rename( columns =rename_dict), train_pre.loc[val_index].rename( columns =rename_dict)\n    y_train_mlp ,y_val_mlp = target[trn_index], target[val_index]\n    \n    model_mlp = tf.keras.models.Sequential([\n        tf.keras.layers.Input(X_train_mlp.shape[1]),\n        tf.keras.layers.Dense(32, activation='relu'),\n        tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(16, activation='relu'),\n        tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(16, activation='relu'),\n        tf.keras.layers.Dense(2, activation='softmax')\n    ])\n    early_stopping =  EarlyStopping(\n                            monitor='val_loss',\n                            patience=10,\n                            mode='auto'\n                        )\n    model_mlp.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),\n                  loss='categorical_crossentropy',\n                  metrics=['accuracy'])\n\n    model_mlp.fit(\n        X_train_mlp, to_categorical(y_train_mlp),validation_data = (X_val_mlp,to_categorical(y_val_mlp)),\n        batch_size=256, epochs=300, verbose=False,callbacks=[early_stopping]\n    )\n    \n    # LogisticRegression Part\n    print('-' *10 +' Start_rogi ' +'-' *10)\n    model_rogi = LogisticRegression()\n    model_rogi.fit(\n        X_train_mlp, y_train\n        )\n    models_rogi.append(model_rogi)\n    \n    # SVM Part\n    print('-' *10 +' Start_SVM ' +'-' *10)\n    model_svm = SVC(random_state=0)\n    model_svm.fit(\n        X_train_mlp, y_train\n        )\n    models_svm.append(model_svm)\n    \n    # それぞれのモデルで予測し、正答率を算出\n    train_pred = np.zeros((len(y_train_mlp), 5))\n    \n    train_pred[:,0] = np.where(model_lgb.predict(X_train)>=0.5, 1, 0)\n    train_pred[:,1] = model_rf.predict(X_train)\n    train_pred[:,2] = np.argmax(model_mlp.predict(X_train_mlp),axis=1)\n    train_pred[:,3] = model_rogi.predict(X_train_mlp)\n    train_pred[:,4] = model_svm.predict(X_train_mlp)\n\n    train_acc = accuracy_score(\n        y_train, stats.mode(train_pred,axis=1)[0]\n        )\n    train_acc_list.append(train_acc)\n    \n    val_pred = np.zeros((len(y_val_mlp), 5))\n    \n    val_pred[:,0] = np.where(model_lgb.predict(X_val)>=0.5, 1, 0)\n    val_pred[:,1] = model_rf.predict(X_val)\n    val_pred[:,2] = np.argmax(model_mlp.predict(X_val_mlp),axis=1)\n    val_pred[:,3] = model_rogi.predict(X_val_mlp)\n    val_pred[:,4] = model_svm.predict(X_val_mlp)\n\n    val_acc = accuracy_score(\n        y_val, stats.mode(val_pred,axis=1)[0]\n        )\n    val_acc_list.append(val_acc)\n    \n    \nprint('-'*10 + 'Result' +'-'*10)\nprint(f'Train_acc : {train_acc_list} , Ave : {np.mean(train_acc_list)}')\nprint(f'Valid_acc : {val_acc_list} , Ave : {np.mean(val_acc_list)}')\n\n# 予測結果をサブミットするファイル形式に変更\ntest_pred = np.zeros((len(test), 5))\ntest_mlp = pd.get_dummies(test, columns= ['Title_Encode']).rename( columns =rename_dict)\n\ntest_pred[:,0] = np.where(model_lgb.predict(test)>=0.5, 1, 0)\ntest_pred[:,1] = model_rf.predict(test)\ntest_pred[:,2] = np.argmax(model_mlp.predict(test_mlp),axis=1)\ntest_pred[:,3] = model_rogi.predict(test_mlp)\ntest_pred[:,4] = model_svm.predict(test_mlp)\n\ntest_pred = test_pred.astype(int)\n\n# 提出ファイルを出力 (1.3.6)\nsample_sub = pd.read_csv('/kaggle/input/titanic/gender_submission.csv')\nsample_sub[\"Survived\"] = stats.mode(test_pred,axis=1)[0]\nsample_sub.to_csv(\"submission4.csv\", index=False) #★submission4.csv\n\ndisplay(sample_sub) #★確認","metadata":{"execution":{"iopub.status.busy":"2022-07-15T11:14:26.492498Z","iopub.execute_input":"2022-07-15T11:14:26.493150Z","iopub.status.idle":"2022-07-15T11:14:48.491682Z","shell.execute_reply.started":"2022-07-15T11:14:26.493117Z","shell.execute_reply":"2022-07-15T11:14:48.490074Z"},"trusted":true},"execution_count":null,"outputs":[]}]}