Skip to content

Commit 98a3ed7

Browse files
committed
Merge branch 'main' into community_proj
2 parents 7c34f28 + 433b7ee commit 98a3ed7

3 files changed

Lines changed: 92 additions & 24 deletions

File tree

stemflow/model/AdaSTEM.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -975,12 +975,14 @@ def find_belonged_points_and_predict(df, st_indexes_df, X_df):
975975

976976
# if len(res)>0:
977977
# res = res.droplevel(0) # If using as_index=False duing groupby, pandas will automatically generate a group indexing column, so drop the indexing of the new groups
978-
978+
if len(res)==0:
979+
continue
980+
979981
window_prediction_list.append(res)
980982

981983
if any([i is not None for i in window_prediction_list]):
982984
ensemble_prediction = pd.concat(window_prediction_list, axis=0)
983-
ensemble_prediction = ensemble_prediction.groupby("index").mean().reset_index(drop=False)
985+
ensemble_prediction = ensemble_prediction.groupby(level=0, sort=False).mean()
984986
else:
985987
ensmeble_index = list(window_single_ensemble_df["ensemble_index"])[0]
986988
warnings.warn(f"No prediction for this ensemble: {ensmeble_index}")
@@ -1028,7 +1030,7 @@ def mp_predict(ensemble, self=self):
10281030
)
10291031

10301032
# Prediction
1031-
pred = [i.set_index("index") for i in output_generator]
1033+
pred = [i for i in output_generator]
10321034
get_reusable_executor().shutdown(wait=True)
10331035

10341036
pred = pd.concat(pred, axis=1)

stemflow/model/SphereAdaSTEM.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,18 @@ def find_belonged_points(df, st_indexes_df, X_df):
485485

486486
return X_df.iloc[np.where(intersect)[0], :]
487487

488-
query_results = (
488+
def find_belonged_points_and_predict(df, st_indexes_df, X_df):
489+
X = find_belonged_points(df, st_indexes_df, X_df)
490+
if len(X)==0:
491+
return None
492+
X['ensemble_index'] = df['ensemble_index'].iloc[0]
493+
X['unique_stixel_id'] = df['unique_stixel_id'].iloc[0]
494+
# X = X.sort_index() # To ensure the input dataframes for the two method (temporal_window_prequery or not) are the same so the tained base models are identical, at least with the same input data
495+
pred = self.stixel_predict(X)
496+
return pred
497+
498+
# predict
499+
window_prediction = (
489500
window_single_ensemble_df[
490501
[
491502
"ensemble_index",
@@ -501,32 +512,21 @@ def find_belonged_points(df, st_indexes_df, X_df):
501512
"p3z",
502513
]
503514
]
504-
.groupby(["ensemble_index", "unique_stixel_id"], as_index=True)
515+
.groupby(["ensemble_index", "unique_stixel_id"], as_index=False, group_keys=False)
505516
.pipe(lambda x: x[x.obj.columns])
506-
.apply(find_belonged_points, st_indexes_df=window_X_df_indexes_only, X_df=window_X_df, include_groups=False)
507-
.reset_index(level=["ensemble_index", "unique_stixel_id"])
517+
.apply(find_belonged_points_and_predict, st_indexes_df=window_X_df_indexes_only, X_df=window_X_df, include_groups=False)
508518
)
509519

510-
if len(query_results) == 0:
520+
if len(window_prediction) == 0:
511521
"""All points fall out of the grids"""
512522
continue
513523

514-
# predict
515-
window_prediction = (
516-
query_results
517-
.dropna(subset="unique_stixel_id")
518-
.groupby("unique_stixel_id", as_index=False, group_keys=False)
519-
.pipe(lambda x: x[x.obj.columns])
520-
.apply(lambda stixel: self.stixel_predict(stixel), include_groups=False)
521-
)
522524
# print('window_prediction:',window_prediction)
523525
window_prediction_list.append(window_prediction)
524526

525527
if any([i is not None for i in window_prediction_list]):
526528
ensemble_prediction = pd.concat(window_prediction_list, axis=0)
527529
ensemble_prediction = ensemble_prediction.groupby(level=0).mean()
528-
ensemble_prediction.index.name = "index"
529-
ensemble_prediction = ensemble_prediction.reset_index(drop=False)
530530
else:
531531
ensmeble_index = list(window_single_ensemble_df["ensemble_index"])[0]
532532
warnings.warn(f"No prediction for this ensemble: {ensmeble_index}")

tests/test_model.py

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ def test_STEMClassifier():
5353
importances_by_points = model.assign_feature_importances_by_points(verbosity=0, n_jobs=1)
5454
assert importances_by_points.shape[0] > 0
5555
assert importances_by_points.shape[1] == len(x_names) + 3
56+
57+
## Then predict on limited samples?
58+
pred = model.predict(X_test.sample(n=1, replace=False))
5659

5760

5861
def test_parallel_STEMClassifier():
@@ -85,7 +88,9 @@ def test_parallel_STEMClassifier():
8588
assert importances_by_points.shape[0] > 0
8689
assert importances_by_points.shape[1] == len(x_names) + 3
8790

88-
91+
## Then predict on limited samples?
92+
pred = model.predict(X_test.sample(n=1, replace=False))
93+
8994
def test_STEMRegressor():
9095
model = make_STEMRegressor()
9196
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -116,7 +121,9 @@ def test_STEMRegressor():
116121
assert importances_by_points.shape[0] > 0
117122
assert importances_by_points.shape[1] == len(x_names) + 3
118123

119-
124+
## Then predict on limited samples?
125+
pred = model.predict(X_test.sample(n=1, replace=False))
126+
120127
def test_AdaSTEMClassifier():
121128
model = make_AdaSTEMClassifier()
122129
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -147,6 +154,9 @@ def test_AdaSTEMClassifier():
147154
assert importances_by_points.shape[0] > 0
148155
assert importances_by_points.shape[1] == len(x_names) + 3
149156

157+
## Then predict on limited samples?
158+
pred = model.predict(X_test.sample(n=1, replace=False))
159+
150160

151161
def test_AdaSTEMRegressor():
152162
model = make_AdaSTEMRegressor()
@@ -188,7 +198,9 @@ def test_AdaSTEMRegressor():
188198
# score
189199
score_df = model.score(X_test, y_test)
190200

191-
201+
## Then predict on limited samples?
202+
pred = model.predict(X_test.sample(n=1, replace=False))
203+
192204
def test_parallel_AdaSTEMClassifier():
193205
model = make_parallel_AdaSTEMClassifier()
194206
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -219,8 +231,53 @@ def test_parallel_AdaSTEMClassifier():
219231
assert importances_by_points.shape[0] > 0
220232
assert importances_by_points.shape[1] == len(x_names) + 3
221233

234+
## Then predict on limited samples?
235+
pred = model.predict(X_test.sample(n=1, replace=False))
236+
237+
238+
def test_AdaSTEMRegressor_return_ensemble():
239+
model = make_AdaSTEMRegressor()
240+
y_train.loc[:] = np.where(y_train > 0, 1, 0)
241+
model = model.fit(X_train, y_train)
242+
243+
pred_mean, pred_std = model.predict(X_test.reset_index(drop=True), return_std=True, verbosity=1, n_jobs=1)
244+
assert np.sum(~np.isnan(pred_mean)) > 0
245+
assert np.sum(~np.isnan(pred_std)) > 0
246+
247+
pred_ = model.predict(X_test, aggregation='median')
248+
assert len(pred_) == len(X_test)
249+
assert np.sum(np.isnan(pred_)) / len(pred_) <= 0.3
250+
251+
pred_return_by_separate_ensembles = model.predict(X_test, return_by_separate_ensembles=True)
252+
assert pred_return_by_separate_ensembles.shape[1]==model.ensemble_fold
253+
254+
pred = model.predict(X_test)
255+
assert len(pred) == len(X_test)
256+
assert np.sum(np.isnan(pred)) / len(pred) <= 0.3
257+
258+
pred_df = pd.DataFrame(
259+
{"y_true": np.array(y_test).flatten(), "y_pred": np.where(pred < 0, 0, pred).flatten()}
260+
).dropna()
261+
assert len(pred_df) > 0
262+
263+
eval = AdaSTEM.eval_STEM_res("hurdle", pred_df.y_true, pred_df.y_pred)
264+
assert eval["AUC"] >= 0.5
265+
assert eval["kappa"] >= 0.2
266+
assert eval["Spearman_r"] >= 0.2
222267

268+
model.calculate_feature_importances()
269+
assert model.feature_importances_.shape[0] > 0
223270

271+
importances_by_points = model.assign_feature_importances_by_points(verbosity=0, n_jobs=1)
272+
assert importances_by_points.shape[0] > 0
273+
assert importances_by_points.shape[1] == len(x_names) + 3
274+
275+
# score
276+
score_df = model.score(X_test, y_test)
277+
278+
## Then predict on limited samples?
279+
pred = model.predict(X_test.sample(n=1, replace=False))
280+
224281
def test_SphereAdaClassifier():
225282
model = make_SphereAdaClassifier()
226283
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -255,6 +312,9 @@ def test_SphereAdaClassifier():
255312
assert importances_by_points.shape[0] > 0
256313
assert importances_by_points.shape[1] == len(x_names) + 3
257314

315+
## Then predict on limited samples?
316+
pred = model.predict(X_test.sample(n=1, replace=False))
317+
258318
def test_parallel_SphereAdaClassifier():
259319
model = make_parallel_SphereAdaClassifier()
260320
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -286,7 +346,9 @@ def test_parallel_SphereAdaClassifier():
286346
assert importances_by_points.shape[0] > 0
287347
assert importances_by_points.shape[1] == len(x_names) + 3
288348

289-
349+
## Then predict on limited samples?
350+
pred = model.predict(X_test.sample(n=1, replace=False))
351+
290352
def test_SphereAdaSTEMRegressor():
291353
model = make_SphereAdaSTEMRegressor()
292354
y_train.loc[:] = np.where(y_train > 0, 1, 0)
@@ -317,7 +379,9 @@ def test_SphereAdaSTEMRegressor():
317379
assert importances_by_points.shape[0] > 0
318380
assert importances_by_points.shape[1] == len(x_names) + 3
319381

320-
382+
## Then predict on limited samples?
383+
pred = model.predict(X_test.sample(n=1, replace=False))
384+
321385
def test_AdaSTEMRegressor_Hurdle_for_AdaSTEM():
322386
model = make_AdaSTEMRegressor_Hurdle_for_AdaSTEM()
323387
model = model.fit(X_train, y_train)
@@ -339,7 +403,9 @@ def test_AdaSTEMRegressor_Hurdle_for_AdaSTEM():
339403
assert eval["kappa"] >= 0.1
340404
assert eval["Spearman_r"] >= 0.1
341405

342-
406+
## Then predict on limited samples?
407+
pred = model.predict(X_test.sample(n=1, replace=False))
408+
343409

344410
# def test_AdaSTEMRegressor_median():
345411
# model = make_AdaSTEMRegressor()

0 commit comments

Comments
 (0)