{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Read data\n\nimport pandas as pd\nfrom pathlib import Path\n\ninput_path = Path('../input/tabular-playground-series-jul-2022/')\ndata = pd.read_csv(input_path / 'data.csv', index_col='id')\n\nsample_submission = pd.read_csv(\n    input_path / 'sample_submission.csv',\n    index_col='Id'\n)\n\nprint(data.shape)\ndata.info()\ndata.head()\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# calculate number of clusters by Elbow Method\n\nfrom sklearn.cluster import KMeans\nimport matplotlib.pyplot as plt\n\n\ndef create_kmeans_model(\n    X: pd.DataFrame,\n    n_clusters: int,\n    init: str = 'k-means++',\n    max_iter: int = 300,\n) -> KMeans:\n    kmeans = KMeans(\n        n_clusters=n_clusters,\n        init=init,\n        random_state=0,\n        max_iter=max_iter,\n    )\n    kmeans.fit(X)\n    return kmeans\n\n\ndef do_elbow_method(\n    X: pd.DataFrame,\n    clusters_range: range,\n    init: str = 'k-means++',\n    max_iter: int = 300,\n) -> None:\n    inertia_list = [\n        create_kmeans_model(X, i, init, max_iter).inertia_\n        for i in clusters_range\n    ]\n\n    plt.plot(clusters_range, inertia_list)\n    plt.xlabel('Number of clusters')\n    plt.ylabel('Inertia')\n    plt.title('max_iter: {}'.format(max_iter))\n    plt.show()\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# do_elbow_method(data, range(10, 100))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nfrom sklearn.mixture import GaussianMixture\n\n\ndef create_gmm_model(\n    X: pd.DataFrame,\n    n_components: int,\n    covariance_type: str = 'full',\n    max_iter: int = 100,\n    init_params: str = 'kmeans',\n    warm_start: bool = False,\n) -> GaussianMixture:\n    model = GaussianMixture(\n        n_components=n_components,\n        covariance_type=covariance_type,\n        max_iter=max_iter,\n        init_params=init_params,\n        random_state=0,\n        warm_start=warm_start,\n    )\n    model.fit(X)\n    return model\n\n\ndef plot_gmm_result(X: pd.DataFrame, n_components_range: range) -> None:\n    models = [\n        create_gmm_model(X, n_components)\n        for n_components in n_components_range\n    ]\n\n    fig, ax = plt.subplots()\n    ax.plot(n_components_range, [m.bic(X) for m in models], label='BIC')\n    ax.plot(n_components_range, [m.aic(X) for m in models], label='AIC')\n\n    plt.legend(loc='best')\n    plt.xlabel('n_components')\n    plt.show\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_gmm_result(data, range(1, 30))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create submission file\n\nfrom tqdm import tqdm\nfrom typing import List\n\n\ndef create_submission(labels: List[int]) -> pd.DataFrame:\n    submission = sample_submission.copy()\n    for i in tqdm(submission.index):\n        submission.loc[i, 'Predicted'] = labels[i]\n    return submission\n\n\ndef create_kmeans_submission(n_clusters: int) -> pd.DataFrame:\n    model = create_kmeans_model(data, n_clusters=n_clusters)\n    model.fit(data)\n    return create_submission(model.labels_.tolist())\n\n\ndef create_gmm_submission(n_components: int):\n    gmm_model = create_gmm_model(data, n_components=n_components)\n    gmm_model.fit(data)\n    predict = gmm_model.predict(data)\n    return create_submission(predict.tolist())\n\n\n# create_kmeans_submission(100).to_csv('kmeans_result.csv')\ncreate_gmm_submission(27).to_csv('gmm_result.csv')\n","metadata":{},"execution_count":null,"outputs":[]}]}