{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Predict magnetic interaction between atom --> Scalar Coupling Constant #"},{"metadata":{},"cell_type":"markdown","source":"![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjwzxgeC8tliHs2amB7Q4NuFgqaopuiMO6fvASt79u1kBzvyDQ)"},{"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 all files under the input directory\n\nimport os\nimport math \nimport warnings\nwarnings.filterwarnings(\"ignore\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nnumber = LabelEncoder()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"df_test = pd.read_csv('/kaggle/input/test.csv')\ndf_struct = pd.read_csv('/kaggle/input/structures.csv',dtype={'atom_index': np.int8,'x': np.float16,'y': np.float16,'z': np.float16})\ndf_train = pd.read_csv('/kaggle/input/train.csv',dtype={'id': np.int8,'atom_index0': np.int8,'atom_index1': np.int8,'scalar_coupling_constant': np.float16})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"train datatype\")\ndf_train.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"structure datatype\")\ndf_struct.dtypes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"train length -\", len(df_train))\nprint(\"test length -\", len(df_test))\nprint(\"structure length -\", len(df_struct))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"train unique -\",len(df_train['molecule_name'].unique()))\nprint(\"test unique -\",len(df_test['molecule_name'].unique()))\nprint(\"structure unique -\",len(df_struct['molecule_name'].unique()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Scalar constant less than 0 -\",len(df_train[df_train['scalar_coupling_constant'] < 0]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"train\")\ndf_train.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"struct\")\ndf_struct.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"test\")\ndf_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Merge x,y,z co-ordinates\ndf_struct['xyz'] = df_struct[['x','y','z']].values.tolist()\ndf_struct = df_struct.drop(['x','y','z'], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"train unique coupling type -\",df_train['type'].unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"test unique coupling type -\",df_test['type'].unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"struct unique atom type -\",df_struct['atom'].unique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"test\")\ndf_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Molecule and atom index common in all dataset\ndf_struct.set_index(['molecule_name','atom_index'], inplace = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Function to get atom\ndef funatom(x,y):\n    return df_struct.loc[x,y]['atom']\n\n# Function to get x,y,z co-ordinate of atom\ndef funxyz(x,y):\n    return df_struct.loc[x,y]['xyz']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Populate train data\ndf_train['atom_0'] = df_train.apply(lambda x: funatom(x['molecule_name'], x['atom_index_0']), axis=1)\ndf_train['atom_1'] = df_train.apply(lambda x: funatom(x['molecule_name'], x['atom_index_1']), axis=1)\ndf_train['xyz_0'] = df_train.apply(lambda x: funxyz(x['molecule_name'], x['atom_index_0']), axis=1)\ndf_train['xyz_1'] = df_train.apply(lambda x: funxyz(x['molecule_name'], x['atom_index_1']), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Populate test data\ndf_test['atom_0'] = df_test.apply(lambda x: funatom(x['molecule_name'], x['atom_index_0']), axis=1)\ndf_test['atom_1'] = df_test.apply(lambda x: funatom(x['molecule_name'], x['atom_index_1']), axis=1)\ndf_test['xyz_0'] = df_test.apply(lambda x: funxyz(x['molecule_name'], x['atom_index_0']), axis=1)\ndf_test['xyz_1'] = df_test.apply(lambda x: funxyz(x['molecule_name'], x['atom_index_1']), axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Create new train columns\ndf_train['type_num'] = number.fit_transform(df_train['type'].astype('str'))\ndf_train['atom_1_num'] = number.fit_transform(df_train['atom_1'].astype('str'))\ndf_train['xyz'] = df_train['xyz_0'] + df_train['xyz_1']\ndf_train['atom_0_num'] = 1\ndf_train['atom_same_diff'] = (df_train['atom_0_num'] == df_train['atom_1_num']).astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Create new test columns\ndf_test['type_num'] = number.fit_transform(df_test['type'].astype('str'))\ndf_test['atom_1_num'] = number.fit_transform(df_test['atom_1'].astype('str'))\ndf_test['xyz'] = df_test['xyz_0'] + df_test['xyz_1']\ndf_test['atom_0_num'] = 1\ndf_test['atom_same_diff'] = (df_test['atom_0_num'] == df_test['atom_1_num']).astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Function to create additional features\n\ndef fundis(x):\n    x1 = x[0] ; x2 = x[3] ; y1 = x[1] ; y2 = x[4] ; z1 = x[2] ; z2 = x[5]\n    return math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2) * 1)\n\ndef fundotprod(x):\n    x1 = x[0] ; x2 = x[3] ; y1 = x[1] ; y2 = x[4] ; z1 = x[2] ; z2 = x[5]\n    return (x1*x2 + y1*y2 + z1*z2)\n\ndef funmod(x): \n    x1 = x[0] ; y1 = x[1] ; z1 = x[2]\n    return math.sqrt(math.pow(x1, 2) + math.pow(y1, 2) + math.pow(z1, 2))\n\ndef funangle(x):\n    return math.degrees(math.acos(x))\n\n\ndef funsqdisx(x):\n    x1 = x[0] ; x2 = x[3] \n    return math.sqrt(math.pow(x2 - x1, 2) * 1)\n\ndef funsqdisy(x):\n    y1 = x[1] ; y2 = x[4] \n    return math.sqrt(math.pow(y2 - y1, 2) * 1)\n\ndef funsqdisz(x):\n    z1 = x[2] ; z2 = x[5] \n    return math.sqrt(math.pow(z2 - z1, 2) * 1)\n\n\ndef fundisx(x):\n    x1 = x[0] ; x2 = x[3] \n    return (x2 - x1)\n\ndef fundisy(x):\n    y1 = x[1] ; y2 = x[4] \n    return (y2 - y1)\n\ndef fundisz(x):\n    z1 = x[2] ; z2 = x[5] \n    return (z2 - z1)\n\n\ndef funsumxyz(x):\n    x1 = x[0] ; y1 = x[1] ; z1 = x[2]\n    return(x1+y1+z1)\n\n\ndef funcross(x,y):\n    return np.cross(x, y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train['dis'] = df_train['xyz'].apply(fundis)\ndf_test['dis'] = df_test['xyz'].apply(fundis)\n\ndf_train['dotprod'] = df_train['xyz'].apply(fundotprod)\ndf_test['dotprod'] = df_test['xyz'].apply(fundotprod)\n\ndf_train['modxyz0'] = df_train['xyz_0'].apply(funmod)\ndf_train['modxyz1'] = df_train['xyz_1'].apply(funmod)\n\ndf_test['modxyz0'] =df_test['xyz_0'].apply(funmod)\ndf_test['modxyz1'] = df_test['xyz_1'].apply(funmod)\n\ndf_train['anglecos'] = df_train['dotprod'] / (df_train['modxyz0'] * df_train['modxyz1'])\ndf_test['anglecos'] = df_test['dotprod'] / (df_test['modxyz0'] * df_test['modxyz1'])\n\ndf_train['angle'] = df_train['anglecos'].apply(funangle)\ndf_test['angle'] = df_test['anglecos'].apply(funangle)\n\ndf_train['sqdisx'] = df_train['xyz'].apply(funsqdisx)\ndf_train['sqdisy'] = df_train['xyz'].apply(funsqdisy)\ndf_train['sqdisz'] = df_train['xyz'].apply(funsqdisz)\n\ndf_train['disx'] = df_train['xyz'].apply(fundisx)\ndf_train['disy'] = df_train['xyz'].apply(fundisy)\ndf_train['disz'] = df_train['xyz'].apply(fundisz)\n\ndf_train['sumxyz0'] = df_train['xyz_0'].apply(funsumxyz)\ndf_train['sumxyz1'] = df_train['xyz_1'].apply(funsumxyz)\n\ndf_train['cross'] = df_train.apply(lambda x: funcross(x['xyz_0'], x['xyz_1']), axis=1)\ndf_train['modcross'] = df_train['cross'].apply(funmod)\ndf_train['sumcross'] = df_train['cross'].apply(funsumxyz)\n\ndf_test['sqdisx'] = df_test['xyz'].apply(funsqdisx)\ndf_test['sqdisy'] = df_test['xyz'].apply(funsqdisy)\ndf_test['sqdisz'] = df_test['xyz'].apply(funsqdisz)\n\ndf_test['disx'] = df_test['xyz'].apply(fundisx)\ndf_test['disy'] = df_test['xyz'].apply(fundisy)\ndf_test['disz'] = df_test['xyz'].apply(fundisz)\n\ndf_test['sumxyz0'] = df_test['xyz_0'].apply(funsumxyz)\ndf_test['sumxyz1'] = df_test['xyz_1'].apply(funsumxyz)\n\ndf_test['cross'] = df_test.apply(lambda x: funcross(x['xyz_0'], x['xyz_1']), axis=1)\ndf_test['modcross'] = df_test['cross'].apply(funmod)\ndf_test['sumcross'] = df_test['cross'].apply(funsumxyz)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Selecting train ,test and target to be predicted\ntrain = df_train[['atom_1_num','dis','dotprod','modxyz0','modxyz1','angle','disx','disy','disz','sqdisx','sqdisy','sqdisz','sumxyz0','sumxyz1','modcross','sumcross']]\ny = df_train[['scalar_coupling_constant']]\ntest = df_test[['atom_1_num','dis','dotprod','modxyz0','modxyz1','angle','disx','disy','disz','sqdisx','sqdisy','sqdisz','sumxyz0','sumxyz1','modcross','sumcross']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Converting train and test to numpy data type for performance\ntrain['atom_1_num'] = train['atom_1_num'].astype(np.int8)\ntrain['dis'] = train['dis'].astype(np.float16)\ntrain['dotprod'] = train['dotprod'].astype(np.float16)\ntrain['modxyz0'] = train['modxyz0'].astype(np.float16)\ntrain['modxyz1'] = train['modxyz1'].astype(np.float16)\ntrain['angle'] = train['angle'].astype(np.float16)\ntrain['disx'] = train['disx'].astype(np.float16)\ntrain['disy'] = train['disy'].astype(np.float16)\ntrain['disz'] = train['disz'].astype(np.float16)\ntrain['sqdisx'] = train['sqdisx'].astype(np.float16)\ntrain['sqdisy'] = train['sqdisy'].astype(np.float16)\ntrain['sqdisz'] = train['sqdisz'].astype(np.float16)\ntrain['sumxyz0'] = train['sumxyz0'].astype(np.float16)\ntrain['sumxyz1'] = train['sumxyz1'].astype(np.float16)\ntrain['modcross'] = train['modcross'].astype(np.float16)\ntrain['sumcross'] = train['sumcross'].astype(np.float16)\n\ntest['atom_1_num'] = test['atom_1_num'].astype(np.int8)\ntest['dis'] = test['dis'].astype(np.float16)\ntest['dotprod'] = test['dotprod'].astype(np.float16)\ntest['modxyz0'] = test['modxyz0'].astype(np.float16)\ntest['modxyz1'] = test['modxyz1'].astype(np.float16)\ntest['angle'] = test['angle'].astype(np.float16)\ntest['disx'] = test['disx'].astype(np.float16)\ntest['disy'] = test['disy'].astype(np.float16)\ntest['disz'] = test['disz'].astype(np.float16)\ntest['sqdisx'] = test['sqdisx'].astype(np.float16)\ntest['sqdisy'] = test['sqdisy'].astype(np.float16)\ntest['sqdisz'] = test['sqdisz'].astype(np.float16)\ntest['sumxyz0'] = test['sumxyz0'].astype(np.float16)\ntest['sumxyz1'] = test['sumxyz1'].astype(np.float16)\ntest['modcross'] = test['modcross'].astype(np.float16)\ntest['sumcross'] = test['sumcross'].astype(np.float16)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nx_train, x_test, y_train, y_test = train_test_split(train, y, test_size=0.2, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\nmodel = lgb.sklearn.LGBMRegressor(num_leaves= 128,\n          min_child_samples= 79,\n          objective= 'regression',\n          max_depth= 9,\n          learning_rate= 0.2,\n          boosting_type= 'gbdt',\n          subsample_freq= 1,\n          subsample= 0.9,\n          bagging_seed= 11,\n          metric= 'mae',\n          verbosity= -1,\n          reg_alpha= 0.1,\n          reg_lambda= 0.3,\n          colsample_bytree= 1.0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(x_train,y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"lgb.plot_importance(model,max_num_features=20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_preds = model.predict(x_test)\ny_preds=pd.Series(y_preds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_preds.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_test = y_test['scalar_coupling_constant']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\n#Creating submission dataframe\ny_preds=pd.Series(y_preds)\npred = pd.DataFrame(df_test['id'])\npred['scalar_coupling_constant'] = y_preds\npred.head()\n'''","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#pred.to_csv(\"submission.csv\", columns = pred.columns, index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#from IPython.display import FileLink, FileLinks\n#FileLinks('.') #lists all downloadable files on server","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import r2_score\nr2_score(y_test, y_preds)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":1}