willengler-uc commited on
Commit
a2e353b
·
verified ·
1 Parent(s): 4239845

Add heusler

Browse files
.gitattributes CHANGED
@@ -61,3 +61,4 @@ model_perovskite_conductivity/model.dill filter=lfs diff=lfs merge=lfs -text
61
  model_metallicglass_Rc_LLM/model.dill filter=lfs diff=lfs merge=lfs -text
62
  model_metallicglass_Rc/model.dill filter=lfs diff=lfs merge=lfs -text
63
  model_metallicglass_Dmax/model.dill filter=lfs diff=lfs merge=lfs -text
 
 
61
  model_metallicglass_Rc_LLM/model.dill filter=lfs diff=lfs merge=lfs -text
62
  model_metallicglass_Rc/model.dill filter=lfs diff=lfs merge=lfs -text
63
  model_metallicglass_Dmax/model.dill filter=lfs diff=lfs merge=lfs -text
64
+ model_heusler/model.dill filter=lfs diff=lfs merge=lfs -text
model_heusler/.gitattributes ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
model_heusler/README.md ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # model_heusler
2
+ Random forest model to predict the magnetization of Heusler alloys
model_heusler/RandomForestRegressor.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e27c34ee725460bf7f312646ee7da4fb8d98b689007647d0059b8a95e5b0b551
3
+ size 38383015
model_heusler/StandardScaler.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c5da6984fcb813e4006ca05afdedf98efb16e95d4684b84fd614d45bf15f2f8b
3
+ size 1364
model_heusler/X_train.csv ADDED
The diff for this file is too large to render. See raw diff
 
model_heusler/model.dill ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6b05d10d6e3480523e605593a0046b62ce07948862c4479c067255b130457364
3
+ size 45232823
model_heusler/predict_heusler.py ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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_heusler'
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
+ for i, x in X.iterrows():
28
+ preds_list = list()
29
+ for pred in model.model.estimators_:
30
+ preds_list.append(pred.predict(np.array(x).reshape(1, -1))[0])
31
+ errs_list.append(np.std(preds_list))
32
+ ebars = a * np.array(errs_list) + b
33
+
34
+ # Get domains
35
+ with open(os.path.join(d, 'model.dill'), 'rb') as f:
36
+ model_domain = dill.load(f)
37
+
38
+ domains = model_domain.predict(X)
39
+
40
+ return preds, ebars, domains
41
+
42
+ def process_data(comp_list):
43
+ X = pd.DataFrame(np.empty((len(comp_list),)))
44
+ y = pd.DataFrame(np.empty((len(comp_list),)))
45
+
46
+ df_test = pd.DataFrame({'Material composition': comp_list})
47
+
48
+ # Try this both ways depending on mastml version used.
49
+ try:
50
+ X, y = ElementalFeatureGenerator(composition_df=df_test['Material composition'],
51
+ feature_types=['composition_avg', 'arithmetic_avg', 'max', 'min','difference'],
52
+ remove_constant_columns=False).evaluate(X=X, y=y, savepath=os.getcwd(), make_new_dir=False)
53
+ except:
54
+ X, y = ElementalFeatureGenerator(featurize_df=df_test['Material composition'],
55
+ feature_types=['composition_avg', 'arithmetic_avg', 'max', 'min',
56
+ 'difference'], remove_constant_columns=False).evaluate(X=X, y=y, savepath=os.getcwd(), make_new_dir=False)
57
+
58
+ df_test = pd.concat([df_test, X], axis=1)
59
+
60
+ return df_test
61
+
62
+ def make_predictions(comp_list, numelec_list, heuslertype_list):
63
+
64
+ # Process data
65
+ df_test = process_data(comp_list)
66
+
67
+ # Process data
68
+ X_train = pd.read_csv('model_heusler/X_train.csv')
69
+ feature_names = X_train.columns.tolist()
70
+
71
+ # Convert heusler type encoding to numbers
72
+ pf_0 = list()
73
+ pf_1 = list()
74
+ pf_2 = list()
75
+ for i in heuslertype_list:
76
+ if i == 'Full Heusler':
77
+ pf_0.append(1)
78
+ pf_1.append(0)
79
+ pf_2.append(0)
80
+ elif i == 'Inverse Heusler':
81
+ pf_0.append(0)
82
+ pf_1.append(1)
83
+ pf_2.append(0)
84
+ elif i == 'Half Heusler':
85
+ pf_0.append(0)
86
+ pf_1.append(0)
87
+ pf_2.append(1)
88
+ else:
89
+ raise ValueError('Heusler type must be one of Full Heusler, Half Heusler, or Inverse Heusler')
90
+
91
+ df_test['heusler type_0'] = pf_0
92
+ df_test['heusler type_1'] = pf_1
93
+ df_test['heusler type_2'] = pf_2
94
+ df_test['num_electron'] = numelec_list
95
+
96
+ # Get the ML predicted values
97
+ preds, ebars, domains = get_preds_ebars_domains(df_test)
98
+
99
+ pred_dict = {'Predicted magnetization (emu/cm3)': preds,
100
+ 'Ebar magnetization (emu/cm3)': ebars}
101
+
102
+ for d in domains.columns.tolist():
103
+ pred_dict[d] = domains[d]
104
+
105
+ del pred_dict['y_pred']
106
+ #del pred_dict['d_pred']
107
+ del pred_dict['y_stdu_pred']
108
+ del pred_dict['y_stdc_pred']
109
+
110
+ for f in feature_names:
111
+ pred_dict[f] = np.array(df_test[f]).ravel()
112
+
113
+ return pd.DataFrame(pred_dict)
model_heusler/recal_dict.csv ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ a,b
2
+ 0.877099152681331,-3.798959368401773e-11
model_heusler/requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ scikit-learn
2
+ numpy
3
+ pandas
4
+ mastml
5
+ pymatgen