Spaces:
Sleeping
Sleeping
File size: 3,332 Bytes
1d6bb40 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | import joblib
import pandas as pd
from src.models.vader_model import get_vader_prediction
from src.models.lr_model import get_lr_prediction
from src.models.bert_model import get_bert_prediction
from src.config import META_MODEL_PATH, META_THRESHOLD_PATH
from src.features.intensifiers import has_negative_intensifier
# Load trained meta-model
meta_model = joblib.load(META_MODEL_PATH)
# Load the decision threshold tuned on the validation set during training
# (see src/models/meta_model.py). Falls back to 0.5 only if a threshold
# file isn't present, e.g. on an older artifact set.
try:
FAILURE_THRESHOLD = joblib.load(META_THRESHOLD_PATH)
except FileNotFoundError:
FAILURE_THRESHOLD = 0.5
def predict_failure(text):
vader_pred, vader_score = get_vader_prediction(text)
lr_pred, lr_confidence = get_lr_prediction(text)
bert_pred, bert_confidence, bert_entropy = (
get_bert_prediction(text)
)
vader_lr_disagreement = int(
vader_pred != lr_pred
)
lr_bert_disagreement = int(
lr_pred != bert_pred
)
vader_bert_disagreement = int(
vader_pred != bert_pred
)
negative_intensifier = has_negative_intensifier(text)
features = pd.DataFrame([{
"vader_pred": vader_pred,
"vader_score": vader_score,
"lr_pred": lr_pred,
"lr_confidence": lr_confidence,
"bert_pred": bert_pred,
"bert_confidence": bert_confidence,
"bert_entropy": bert_entropy,
"vader_lr_disagreement": vader_lr_disagreement,
"lr_bert_disagreement": lr_bert_disagreement,
"vader_bert_disagreement": vader_bert_disagreement,
"has_negative_intensifier": negative_intensifier
}])
failure_probability = meta_model.predict_proba(
features
)[0][1]
warning = (
"TRANSFORMER MAY FAIL"
if failure_probability >= FAILURE_THRESHOLD
else "Prediction appears reliable"
)
return {
"text": text,
"vader_prediction": int(vader_pred),
"lr_prediction": int(lr_pred),
"bert_prediction": int(bert_pred),
"bert_label": "positive" if bert_pred == 1 else "negative",
"vader_label": "positive" if vader_pred == 1 else "negative",
"lr_label": "positive" if lr_pred == 1 else "negative",
"bert_confidence": round(
float(bert_confidence),
4
),
"lr_confidence": round(
float(lr_confidence),
4
),
"vader_score": round(
float(abs(vader_score)),
4
),
"bert_entropy": round(
float(bert_entropy),
4
),
"failure_probability": round(
float(failure_probability),
4
),
"failure_threshold": round(
float(FAILURE_THRESHOLD),
4
),
"is_failure_risk": bool(failure_probability >= FAILURE_THRESHOLD),
"vader_agrees": bool(vader_pred == bert_pred),
"lr_agrees": bool(lr_pred == bert_pred),
"has_negative_intensifier": bool(negative_intensifier),
"warning": warning
}
if __name__ == "__main__":
while True:
text = input("\nEnter text: ")
if text.lower() == "exit":
break
result = predict_failure(text)
print("\nRESULT:\n")
for key, value in result.items():
print(f"{key}: {value}") |