{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Setting every prediction probabilities as 0.5 on train set,  get score 0.6931471805599455.   \nIf this submission get close score on public leadboard, it suggest that the function calc_score() is logically right.  \n\nAnother check see  https://www.kaggle.com/kingstying/mean-baseline?scriptVersionId=43804369  version 2  "},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd \nimport numpy as np","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import log_loss\nimport numpy as np\nimport pandas as pd\n\ndef get_train_qi():\n    df = pd.read_csv(\"../input/rsna-str-pulmonary-embolism-detection/train.csv\")\n    qi = df[[\"pe_present_on_image\",\"StudyInstanceUID\"]].groupby(\"StudyInstanceUID\").mean().reset_index()\n    qi.columns = [\"StudyInstanceUID\", \"qi\"]\n    return qi\n\ndef cross_entropy(targets, predictions,  epsilon=1e-12, reduction='none'):\n    \"\"\"\n    This function is from https://www.kaggle.com/khyeh0719/0929-updated-rsna-competition-metric  \n    Computes cross entropy between targets (encoded as one-hot vectors)\n    and predictions. \n    Input: predictions (N, k1, k2, ...) ndarray\n           targets (N, k1, k2, ...) ndarray\n           reduction: 'none' | 'mean' | 'sum'\n    Returns: scalar\n    \"\"\"\n    predictions = np.clip(predictions, epsilon, 1. - epsilon)\n    \n    ce = -(targets*np.log(predictions) + (1.-targets)*np.log(1.-predictions))\n    \n    if reduction == 'none':\n        return ce\n    \n    ce = np.sum(ce)\n    if reduction == 'sum':\n        return ce\n    \n    if reduction == 'mean':\n        ce /= predictions.shape[0]\n        return ce\n\n    assert False, \"reduction should be 'none' | 'mean' | 'sum'\".format(reduction)\n\ndef calc_score(df, df_probs, qi):\n    cols_label = [\"pe_present_on_image\", \\\n              \"negative_exam_for_pe\", \"indeterminate\", \"chronic_pe\", \\\n              \"acute_and_chronic_pe\", \"central_pe\", \"leftsided_pe\", \\\n              \"rightsided_pe\", \"rv_lv_ratio_gte_1\", \"rv_lv_ratio_lt_1\", ]\n    \n    weights = [0.07361963  ,\\\n                            0.0736196319, 0.09202453988, 0.1042944785,\\\n                           0.1042944785, 0.1877300613, 0.06257668712, \\\n                           0.06257668712, 0.2346625767, 0.0782208589]\n    \n    assert (df[\"SOPInstanceUID\"]==df_probs[\"SOPInstanceUID\"]).all(), f\"SOPInstanceUID not match!\"\n    \n    target_exam = df[[\"StudyInstanceUID\"] + cols_label[1:]].groupby(\"StudyInstanceUID\").mean()\n    probs_exam = df_probs[[\"StudyInstanceUID\"] + cols_label[1:]].groupby(\"StudyInstanceUID\").mean()\n#     probs_exam = pd.merge(target_exam[[\"StudyInstanceUID\"]], probs_exam,on=\"StudyInstanceUID\", how=\"inner\")\n#     assert probs_exam.shape[0]==target_exam.shape[0], f\"probs_exam.shape[0]!=target_exam.shape[0], {probs_exam.shape[0]}!={target_exam.shape[0]}\"\n    \n    \n    score_exam = []\n    epsilon=1e-12\n    for col,w in zip(cols_label[1:],weights[1:]):\n        score = log_loss(target_exam[col].values, np.clip(probs_exam[col].values, epsilon, 1. - epsilon)    ) * w \n        score = score * target_exam.shape[0]   # calc sum, not mean\n        score_exam.append(score)\n        \n    score_exam = np.sum(score_exam)  # sum, not mean\n    \n    df_probs = pd.merge(df_probs, qi, on=\"StudyInstanceUID\", how=\"inner\")\n    df_probs[\"target-pe_present_on_image\"]=df[\"pe_present_on_image\"]\n    \n\n    df_probs[\"score_img\"] = \\\n    df_probs[[\"target-pe_present_on_image\",\"pe_present_on_image\",\"qi\"]].apply(lambda x:cross_entropy(x[0],x[1])*x[2]*weights[0], axis=1 )\n    \n    score_img = df_probs[\"score_img\"].sum()\n    \n    total_score = score_exam + score_img\n    total_weights = np.sum(weights[1:])*df.StudyInstanceUID.nunique() +  np.sum(weights[0]*df_probs[\"qi\"].values)\n    \n    return total_score/total_weights","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"sub = pd.read_csv(\"../input/rsna-str-pulmonary-embolism-detection/sample_submission.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cols_label = [\"pe_present_on_image\", \\\n              \"negative_exam_for_pe\", \"indeterminate\", \"chronic_pe\", \\\n              \"acute_and_chronic_pe\", \"central_pe\", \"leftsided_pe\", \\\n              \"rightsided_pe\", \"rv_lv_ratio_gte_1\", \"rv_lv_ratio_lt_1\", ]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"../input/rsna-str-pulmonary-embolism-detection/train.csv\")\nfor c in cols_label:\n    train[c] = 0.5\n\ntrain_target = pd.read_csv(\"../input/rsna-str-pulmonary-embolism-detection/train.csv\")\n\nqi = get_train_qi()\nscore = calc_score(train_target , train , qi)\n\nprint(f\"score on train set {score}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub.to_csv(\"submission.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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":4}