willengler-uc commited on
Commit
c87d916
·
verified ·
1 Parent(s): fb1fc8d

Upload bandgap model

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ model_bandgap-main/model.dill filter=lfs diff=lfs merge=lfs -text
model_bandgap-main/.DS_Store ADDED
Binary file (6.15 kB). View file
 
model_bandgap-main/README.md ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # model_bandgap
2
+ Random forest model to predict the electronic bandgap of materials
model_bandgap-main/RandomForestRegressor.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2aac588e04f8ca6eca9939a15cba634be0192bf758d69254a1136b9d43356157
3
+ size 56751504
model_bandgap-main/StandardScaler.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5388b3a9923644c020ce41de877705b9d2a42638f1eebadf37001c39b5be50c8
3
+ size 1364
model_bandgap-main/X_train.csv ADDED
The diff for this file is too large to render. See raw diff
 
model_bandgap-main/model.dill ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eef4f41bb460ef87b590a7cd8000305ae312fb18aeaeca075a36639e3b789e71
3
+ size 97348423
model_bandgap-main/predict_bandgap.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ import numpy as np
4
+ import joblib
5
+ import dill
6
+ from mastml.feature_generators import ElementalFeatureGenerator, OneHotGroupGenerator
7
+
8
+ def get_preds_ebars_domains(df_test):
9
+ d = 'model_bandgap'
10
+ scaler = joblib.load(os.path.join(d, 'StandardScaler.pkl'))
11
+ model = joblib.load(os.path.join(d, 'RandomForestRegressor.pkl'))
12
+ df_features = pd.read_csv(os.path.join(d, 'X_train.csv'))
13
+ recal_params = pd.read_csv(os.path.join(d, 'recal_dict.csv'))
14
+
15
+ features = df_features.columns.tolist()
16
+ df_test = df_test[features]
17
+
18
+ X = scaler.transform(df_test)
19
+
20
+ # Make predictions
21
+ preds = model.predict(X)
22
+
23
+ # Get ebars and recalibrate them
24
+ errs_list = list()
25
+ a = recal_params['a'][0]
26
+ b = recal_params['b'][0]
27
+ c = recal_params['c'][0]
28
+ d2 = recal_params['d'][0]
29
+ for i, x in X.iterrows():
30
+ preds_list = list()
31
+ for pred in model.model.estimators_:
32
+ preds_list.append(pred.predict(np.array(x).reshape(1, -1))[0])
33
+ errs_list.append(np.std(preds_list))
34
+ ebars = a * np.array(errs_list)**3 + b * np.array(errs_list)**2 + c * np.array(errs_list) + d2
35
+
36
+ # Get domains
37
+ with open(os.path.join(d, 'model.dill'), 'rb') as f:
38
+ model_domain = dill.load(f)
39
+
40
+ domains = model_domain.predict(X)
41
+
42
+ return preds, ebars, domains
43
+
44
+ def process_data(comp_list):
45
+ X = pd.DataFrame(np.empty((len(comp_list),)))
46
+ y = pd.DataFrame(np.empty((len(comp_list),)))
47
+
48
+ df_test = pd.DataFrame({'Material composition': comp_list})
49
+
50
+ # Try this both ways depending on mastml version used.
51
+ try:
52
+ X, y = ElementalFeatureGenerator(composition_df=df_test['Material composition'],
53
+ feature_types=['composition_avg', 'arithmetic_avg', 'max', 'min','difference'],
54
+ remove_constant_columns=False).evaluate(X=X, y=y, savepath=os.getcwd(), make_new_dir=False)
55
+ except:
56
+ X, y = ElementalFeatureGenerator(featurize_df=df_test['Material composition'],
57
+ feature_types=['composition_avg', 'arithmetic_avg', 'max', 'min',
58
+ 'difference'], remove_constant_columns=False).evaluate(X=X, y=y, savepath=os.getcwd(), make_new_dir=False)
59
+
60
+ df_test = pd.concat([df_test, X], axis=1)
61
+
62
+ return df_test
63
+
64
+ def make_predictions(comp_list):
65
+
66
+ # Process data
67
+ df_test = process_data(comp_list)
68
+
69
+ # Get the ML (RF) predicted ASRs
70
+ preds, ebars, domains = get_preds_ebars_domains(df_test)
71
+
72
+ pred_dict = {'Compositions': comp_list,
73
+ 'Predicted bandgap (eV)': preds,
74
+ 'Ebar bandgap (eV)': ebars}
75
+
76
+ for d in domains.columns.tolist():
77
+ pred_dict[d] = domains[d]
78
+
79
+ del pred_dict['y_pred']
80
+ #del pred_dict['d_pred']
81
+ del pred_dict['y_stdu_pred']
82
+ del pred_dict['y_stdc_pred']
83
+
84
+ return pd.DataFrame(pred_dict)
model_bandgap-main/recal_dict.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ a,b,c,d
2
+ -0.04479678000366065,0.3734571840787366,0.4058749888639601,0.10782248163397348
model_bandgap-main/requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ scikit-learn
2
+ numpy
3
+ pandas
4
+ mastml
5
+ pymatgen