Kaggle competition: PUBG Finish Placement Prediction (Kernels Only)
<SOS> metric: MAE Kaggle data source: pubg-finish-placement-prediction-(kernels-only)<predict_on_test>
warnings.filterwarnings("ignore")
 gc.enable()
print(os.listdir(".. /input"))
predictions = classifier_.predict(xg_test ).astype(int )<split>
def feature_engineering(is_train=True,debug=True):
if is_train:
print("processing train.csv")
 if debug == True:
df = pd.read_csv('.. /input/train_V2.csv', nrows=10000)
 else:
df = pd.read_csv('.. /input/train_V2.csv')
 df = df[df['maxPlace'] > 1]
else:
print("processing test.csv")
 df = pd.read_csv('.. /input/test_V2.csv')
 print("remove some columns")
 target = 'winPlacePerc'
print("Adding Features")
 df['headshotrate'] = df['kills']/df['headshotKills']
df['killStreakrate'] = df['killStreaks']/df['kills']
df['healthitems'] = df['heals'] + df['boosts']
df['totalDistance'] = df['rideDistance'] + df["walkDistance"] + df["swimDistance"]
df['killPlace_over_maxPlace'] = df['killPlace'] / df['maxPlace']
df['headshotKills_over_kills'] = df['headshotKills'] / df['kills']
df['distance_over_weapons'] = df['totalDistance'] / df['weaponsAcquired']
df['walkDistance_over_heals'] = df['walkDistance'] / df['heals']
df['walkDistance_over_kills'] = df['walkDistance'] / df['kills']
df['killsPerWalkDistance'] = df['kills'] / df['walkDistance']
df["skill"] = df["headshotKills"] + df["roadKills"]
df[df == np.Inf] = np.NaN
df[df == np.NINF] = np.NaN
print("Removing Na's From DF")
 df.fillna(0, inplace=True)
 features = list(df.columns)
 features.remove("Id")
 features.remove("matchId")
 features.remove("groupId")
 features.remove("matchType")
 y = None
if is_train:
print("get target")
 y = df.groupby(['matchId','groupId'])[target].agg('mean')
 features.remove(target)
 print("get group mean feature")
 agg = df.groupby(['matchId','groupId'])[features].agg('mean')
 agg_rank = agg.groupby('matchId')[features].rank(pct=True ).reset_index()
if is_train: df_out = agg.reset_index() [['matchId','groupId']]
else: df_out = df[['matchId','groupId']]
df_out = df_out.merge(agg.reset_index() , suffixes=["", ""], how='left', on=['matchId', 'groupId'])
 df_out = df_out.merge(agg_rank, suffixes=["_mean", "_mean_rank"], how='left', on=['matchId', 'groupId'])
 print("get group max feature")
 agg = df.groupby(['matchId','groupId'])[features].agg('max')
 agg_rank = agg.groupby('matchId')[features].rank(pct=True ).reset_index()
df_out = df_out.merge(agg.reset_index() , suffixes=["", ""], how='left', on=['matchId', 'groupId'])
 df_out = df_out.merge(agg_rank, suffixes=["_max", "_max_rank"], how='left', on=['matchId', 'groupId'])
 print("get group min feature")
 agg = df.groupby(['matchId','groupId'])[features].agg('min')
 agg_rank = agg.groupby('matchId')[features].rank(pct=True ).reset_index()
df_out = df_out.merge(agg.reset_index() , suffixes=["", ""], how='left', on=['matchId', 'groupId'])
 df_out = df_out.merge(agg_rank, suffixes=["_min", "_min_rank"], how='left', on=['matchId', 'groupId'])
 print("get group size feature")
 agg = df.groupby(['matchId','groupId'] ).size().reset_index(name='group_size')
 df_out = df_out.merge(agg, how='left', on=['matchId', 'groupId'])
 print("get match mean feature")
 agg = df.groupby(['matchId'])[features].agg('mean' ).reset_index()
df_out = df_out.merge(agg, suffixes=["", "_match_mean"], how='left', on=['matchId'])
 print("get match size feature")
 agg = df.groupby(['matchId'] ).size().reset_index(name='match_size')
 df_out = df_out.merge(agg, how='left', on=['matchId'])
 df_out.drop(["matchId", "groupId"], axis=1, inplace=True)
 X = df_out
del df, df_out, agg, agg_rank
gc.collect()
return X, y
<count_values>
x_train, y_train = feature_engineering(True,False)
 x_test, _ = feature_engineering(False,True )
submission = submit(predictions)
 submission['Survived'].value_counts()<load_from_csv>
x_train = reduce_mem_usage(x_train)
 x_test = reduce_mem_usage(x_test )
train = pd.read_csv('.. /input/train.csv')
 test = pd.read_csv('.. /input/test.csv')
 data = pd.concat([train, test])
 train.shape<categorify>
def post_rst(pred_test):
df_sub = pd.read_csv(".. /input/sample_submission_V2.csv")
 df_test = pd.read_csv(".. /input/test_V2.csv")
 df_sub['winPlacePerc'] = pred_test
df_sub = df_sub.merge(df_test[["Id", "matchId", "groupId", "maxPlace", "numGroups"]], on="Id", how="left")
 df_sub_group = df_sub.groupby(["matchId", "groupId"] ).first().reset_index()
df_sub_group["rank"] = df_sub_group.groupby(["matchId"])["winPlacePerc"].rank()
df_sub_group = df_sub_group.merge(
 df_sub_group.groupby("matchId")["rank"].max().to_frame("max_rank" ).reset_index() ,
on="matchId", how="left")
 df_sub_group["adjusted_perc"] =(df_sub_group["rank"] - 1)/(df_sub_group["numGroups"] - 1)
 df_sub = df_sub.merge(df_sub_group[["adjusted_perc", "matchId", "groupId"]], on=["matchId", "groupId"], how="left")
 df_sub["winPlacePerc"] = df_sub["adjusted_perc"]
df_sub.loc[df_sub.maxPlace == 0, "winPlacePerc"] = 0
df_sub.loc[df_sub.maxPlace == 1, "winPlacePerc"] = 1
subset = df_sub.loc[df_sub.maxPlace > 1]
gap = 1.0 /(subset.maxPlace.values - 1)
 new_perc = np.around(subset.winPlacePerc.values / gap)* gap
df_sub.loc[df_sub.maxPlace > 1, "winPlacePerc"] = new_perc
df_sub.loc[(df_sub.maxPlace > 1)&(df_sub.numGroups == 1), "winPlacePerc"] = 0
assert df_sub["winPlacePerc"].isnull().sum() == 0
df_sub[["Id", "winPlacePerc"]].to_csv("submission.csv", index=False )
sex_label = LabelEncoder()
cabin_label = LabelEncoder()
embarked_label = LabelEncoder()
family_name_label = LabelEncoder()
title_label = LabelEncoder()
title_remap_label = LabelEncoder()
data['Sex_Code'] = sex_label.fit_transform(data.Sex)
 data['Cabin_Prefix'] = data.Cabin.str.get(0 ).fillna('Z')
 data['Cabin_Code'] = cabin_label.fit_transform(data.Cabin.str.get(0 ).fillna('Z'))
data['Has_Cabin'] =(data.Cabin.str.get(0 ).fillna('Z')!= 'Z' ).astype('int32')
 data['Embarked_fillZ'] = data.Embarked.fillna('Z')
 data['Embarked_Code'] = embarked_label.fit_transform(data.Embarked.fillna('S'))
data['FamilySize'] = data.Parch + data.SibSp + 1
data['BigFamily'] = data.FamilySize.apply(lambda s: s if s < 5 else 5)
 data['IsAlone'] = data.FamilySize == 1
data['FamilyName'] = data.Name.str.extract('(\w+),', expand=False)
 data['FamilyName_Code'] = family_name_label.fit_transform(data.FamilyName)
 data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
 mapping = {
'Mlle': 'Miss',
'Ms': 'Miss',
'Dona': 'Mrs',
'Mme': 'Miss',
'Lady': 'Mrs',
'Capt': 'Honorable',
'Countess': 'Honorable',
'Major': 'Honorable',
'Col': 'Honorable',
'Sir': 'Honorable',
'Don': 'Honorable',
'Jonkheer': 'Honorable',
'Rev': 'Honorable',
'Dr': 'Honorable'
}
data['Title_Remap'] = data.Title.replace(mapping)
 data['Title_Code'] = title_label.fit_transform(data.Title)
 data['Title_Remap_Code'] = title_remap_label.fit_transform(data.Title_Remap)
 data.Age = data.Age.fillna(data.Age.median())
 data.Fare = data.Fare.fillna(data.Fare.median() )<merge>
def nn_model(input_shape=x_train.shape[1], hidden_size=64):
model = Sequential()
model.add(Dense(hidden_size, input_dim=input_shape, kernel_initializer='normal'))
model.add(LeakyReLU(0.1))
model.add(Dense(hidden_size, kernel_initializer='normal'))
model.add(LeakyReLU(0.1))
model.add(Dense(hidden_size, kernel_initializer='normal'))
model.add(LeakyReLU(0.1))
model.add(Dense(hidden_size, kernel_initializer='normal'))
model.add(LeakyReLU(0.1))
model.add(Dense(1, kernel_initializer='normal'))
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mae'])
 return model
m = data[['FamilyName', 'Survived']].groupby('FamilyName' ).max()
c = data[['FamilyName', 'PassengerId']].groupby('FamilyName' ).count()
m = m.rename(columns={'Survived': 'FamilySurvived'})
 c = c.rename(columns={'PassengerId': 'FamilyMemberCount'})
 m = m.where(m.join(c ).FamilyMemberCount > 1, other=-1, axis=1 ).fillna(-1 ).join(c)
 m.FamilySurvived = m.FamilySurvived.astype('int32')
 joined_data = data.join(m, on='FamilyName' )<define_search_model>
def train_val_split(x_train, y_train):
train_index = round(int(x_train.shape[0]*0.8))
dev_X = x_train[:train_index]
val_X = x_train[train_index:]
dev_y = y_train[:train_index]
val_y = y_train[train_index:]
del x_train, y_train
gc.collect() ;
return dev_X, val_X, dev_y, val_y
optimal_d = 20
Z = linkage(ticket.reshape(data.shape[0], 1), 'single')
 clusters = fcluster(Z, optimal_d, criterion='distance')
 joined_data['Ticket_Code'] = clusters<sort_values>
dev_X, val_X, dev_y, val_y = train_val_split(x_train, y_train)
 def run_lgb(train_X, train_y, val_X, val_y, x_test):
params = {"objective" : "regression", "metric" : "mae", 'n_estimators':5000, 'early_stopping_rounds':200,
"num_leaves" : 150, "learning_rate" : 0.05, "bagging_fraction" : 0.5,
"bagging_seed" : 0, "num_threads" : 4,"colsample_bytree" : 0.5
}
lgtrain = lgb.Dataset(train_X, label=train_y)
 lgval = lgb.Dataset(val_X, label=val_y)
 model = lgb.train(params, lgtrain, valid_sets=[lgtrain, lgval], early_stopping_rounds=200, verbose_eval=1000)
 pred_test_y = model.predict(x_test, num_iteration=model.best_iteration)
 return pred_test_y
pred_test_lgb = run_lgb(dev_X, dev_y, val_X, val_y, x_test)
 pred_test_lgb = pred_test_lgb.reshape(-1,1)
 del dev_X, val_X, dev_y, val_y
gc.collect()
joined_data[['FamilyName',
'Name',
'Age',
'Fare',
'BigFamily',
'Pclass',
'Has_Cabin',
'Embarked',
'Sex',
'Title',
'Ticket_Code',
'Ticket_Code_Remap',
'Survived']][joined_data.Ticket_Code==89].sort_values(by='FamilyName' )<sort_values>
np.random.seed(42)
 std_scaler = StandardScaler().fit(x_train)
 x_train = std_scaler.transform(x_train)
 x_test = std_scaler.transform(x_test)
 mlp_model = nn_model(x_train.shape[1], hidden_size=64)
 mlp_model.fit(x_train, y_train, batch_size=128, epochs=8, verbose=1, validation_split=0.1, shuffle=True)
 pred_test_mlp = mlp_model.predict(x_test)
 del mlp_model
gc.collect()
joined_data[['FamilyName',
'Name',
'Age',
'Fare',
'BigFamily',
'Pclass',
'Has_Cabin',
'Embarked',
'Sex',
'Title',
'Ticket_Code',
'Ticket_Code_Remap',
'Survived']][joined_data.Ticket_Code==186].sort_values(by='FamilyName' )<sort_values>
del x_train, y_train, x_test
gc.collect()
joined_data[['FamilyName',
'Name',
'Age',
'Fare',
'BigFamily',
'Pclass',
'Has_Cabin',
'Embarked',
'Sex',
'Title',
'Ticket_Code',
'Ticket_Code_Remap',
'Survived']][joined_data.Ticket_Code==127].sort_values(by='FamilyName' )<define_variables>
pred_test =(pred_test_mlp + pred_test_lgb)/ 2.0