{
  "source_file": "0930",
  "source_platform": "Medium",
  "author": "Ransaka Ravihara",
  "title_listed": "SMOTE and Other Options: A Comprehensive Guide to Handling Imbalanced Data",
  "keywords": "SMOTE,类别不平衡,采样",
  "domain": "机器学习",
  "content_type": "深度技术解析",
  "is_paid_flag": "部分免费/会员墙",
  "url": "https://towardsdatascience.com/use-smote-with-caution-3fa015ba3bc5/",
  "publish_date": "2023-01",
  "corpus_stage": "预训练/SFT",
  "notes": "",
  "id": "4b5a9e0cafc8",
  "collected_at": "2026-10-01T23:31:20",
  "title": "SMOTE and Other Options: A Comprehensive Guide to Handling Imbalanced Data | Towards Data Science",
  "body_markdown": "![Revisit consent button](https://cdn-cookieyes.com/assets/images/revisit.svg)\nWe value your privacy\nWe use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \"Accept All\", you consent to our use of cookies.\nCustomise Reject All Accept All\nCustomise Consent Preferences ![](https://cdn-cookieyes.com/assets/images/close.svg)\nWe use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\nThe cookies that are categorised as \"Necessary\" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more\nNecessaryAlways Active\nNecessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\n  * Cookie\nBCTempID\n  * Duration\n10 minutes\n  * Description\nNo description available.\n\n\n  * Cookie\n__cf_bm\n  * Duration\n1 hour\n  * Description\nThis cookie, set by Cloudflare, is used to support Cloudflare Bot Management. \n\n\n  * Cookie\nAWSALBCORS\n  * Duration\n7 days\n  * Description\nAmazon Web Services set this cookie for load balancing.\n\n\n  * Cookie\n_cfuvid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services\n\n\n  * Cookie\nli_gc\n  * Duration\n6 months\n  * Description\nLinkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.\n\n\n  * Cookie\n__hssrc\n  * Duration\nsession\n  * Description\nThis cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.\n\n\n  * Cookie\n__hssc\n  * Duration\n1 hour\n  * Description\nHubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.\n\n\n  * Cookie\nwpEmojiSettingsSupports\n  * Duration\nsession\n  * Description\nWordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.\n\n\n  * Cookie\nBCSessionID\n  * Duration\n1 year 1 month 4 days\n  * Description\nBlueconic sets this cookie as a unique identifier for the BlueConic profile.\n\n\n  * Cookie\n_octo\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nlogged_in\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\n__Secure-YEC\n  * Duration\npast\n  * Description\nYouTube sets this cookie to stores the user's video player preferences using embedded YouTube video\n\n\n  * Cookie\n__eoi\n  * Duration\n6 months\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTGCORS\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\nlogin-status-p\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTG\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\ncsrf_token\n  * Duration\nsession\n  * Description\nNo description available.\n\n\n  * Cookie\ntoken_v2\n  * Duration\n1 day\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nD\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nPHPSESSID\n  * Duration\nsession\n  * Description\nThis cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.\n\n\n  * Cookie\nVISITOR_PRIVACY_METADATA\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to store the user's cookie consent state for the current domain. \n\n\n  * Cookie\ncookietest\n  * Duration\nsession\n  * Description\nThe cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.\n\n\n  * Cookie\n__Host-airtable-session\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\n__Host-airtable-session.sig\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\nm\n  * Duration\n1 year 1 month 4 days\n  * Description\nStripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.\n\n\n  * Cookie\nBIGipServer*\n  * Duration\nsession\n  * Description\nMarketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. \n\n\n  * Cookie\n__cfruid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to identify trusted web traffic.\n\n\n  * Cookie\n_GRECAPTCHA\n  * Duration\n6 months\n  * Description\nGoogle Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.\n\n\n  * Cookie\n__Secure-YNID\n  * Duration\n6 months\n  * Description\nGoogle cookie used to protect user security and prevent fraud, especially during the login process.\n\n\n  * Cookie\ncookieyes-consent\n  * Duration\n1 year\n  * Description\nCookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.\n\n\nFunctional\nFunctional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\n  * Cookie\nlidc\n  * Duration\n1 day\n  * Description\nLinkedIn sets the lidc cookie to facilitate data center selection.\n\n\n  * Cookie\nbrw\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nbrwConsent\n  * Duration\n5 minutes\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nWMF-Uniq\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nloom_anon_comment\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nloom_referral_video\n  * Duration\nsession\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nVISITOR_INFO1_LIVE\n  * Duration\n6 months\n  * Description\nA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.\n\n\n  * Cookie\nyt-remote-connected-devices\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nytidb::LAST_RESULT_ENTRY_KEY\n  * Duration\nNever Expires\n  * Description\nThe cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.\n\n\n  * Cookie\nyt-remote-device-id\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-name\n  * Duration\nsession\n  * Description\nThe yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\nyt-remote-fast-check-period\n  * Duration\nsession\n  * Description\nThe yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-app\n  * Duration\nsession\n  * Description\nThe yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-available\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-installed\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\ncp_session\n  * Duration\n3 months\n  * Description\nCodepen sets this cookie for Help systems found in the website.\n\n\n  * Cookie\nloid\n  * Duration\n1 year 1 month 4 days\n  * Description\nThis cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.\n\n\nAnalytics\nAnalytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\n  * Cookie\n__hstc\n  * Duration\n6 months\n  * Description\nHubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).\n\n\n  * Cookie\nhubspotutk\n  * Duration\n6 months\n  * Description\nHubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.\n\n\n  * Cookie\n_ga\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.\n\n\n  * Cookie\n_ga_*\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to store and count page views.\n\n\n  * Cookie\n__Host-psifi.analyticsTrace\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n__Host-psifi.analyticsTraceV2\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n_gh_sess\n  * Duration\nsession\n  * Description\nGitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.\n\n\n  * Cookie\nYSC\n  * Duration\nsession\n  * Description\nYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.\n\n\n  * Cookie\najs_anonymous_id\n  * Duration\n1 year\n  * Description\nThis cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.\n\n\n  * Cookie\nvuid\n  * Duration\n1 year 1 month 4 days\n  * Description\nVimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. \n\n\nPerformance\nPerformance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\n  * Cookie\nAWSALB\n  * Duration\n7 days\n  * Description\nAWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.\n\n\n  * Cookie\nacq\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nacq.sig\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nptc\n  * Duration\n2 years\n  * Description\nNo description available.\n\n\nAdvertisement\nAdvertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\n  * Cookie\nmuc_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to collect user behaviour and interaction data to optimize the website.\n\n\n  * Cookie\nguest_id_marketing\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\nguest_id_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\npersonalization_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.\n\n\n  * Cookie\nguest_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.\n\n\n  * Cookie\nbcookie\n  * Duration\n1 year\n  * Description\nLinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.\n\n\n  * Cookie\n__Secure-ROLLOUT_TOKEN\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.\n\n\n  * Cookie\nyt.innertube::nextId\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nyt.innertube::requests\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nsession_tracker\n  * Duration\nsession\n  * Description\nThis cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.\n\n\n  * Cookie\nedgebucket\n  * Duration\nsession\n  * Description\nReddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.\n\n\n  * Cookie\ndid\n  * Duration\n1 year\n  * Description\nArbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.\n\n\nUncategorised\nOther uncategorised cookies are those that are being analysed and have not been classified into a category as yet.\nNo cookies to display.\nReject All Save My Preferences Accept All\nToggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n[Data Science](https://towardsdatascience.com/category/data-science/)\n# SMOTE and Other Options: A Comprehensive Guide to Handling Imbalanced Data\nThe guide on when to use and when not to use synthetic data to tackle the class imbalance\n[Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\nJanuary 3, 202310 min read\n![Photo by 은 하 on Unsplash](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/0koERRrbi5thbuS5Y-scaled.jpg)\nPhoto by [은 하](https://unsplash.com/@b0nn13_4nd_clyd3?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)\nIf you are a machine learning practitioner, you may face class imbalance problems more often. Class imbalance happens when there is a different class distribution in the dataset. Let's take an example. Assume we are working on a churn problem. In this specific scenario, our minor and majority classes are customer churn, and the customer stays with the current service provider. But if you explore this problem more, you will notice fewer customers for the churn category because customer churn is an infrequent event that is good for business but not for the model. As a result, if we feed this dataset into the model, it will learn the majority pattern (non-churn scenario) more accurately than the minor scenario. This is where our problem begins.\n* * *\nLearn this step by step with the interactive [AI and Data Scientist](https://roadmap.sh/ai-data-scientist) and [Machine Learning](https://roadmap.sh/machine-learning) roadmaps.\n## How to deal with the class imbalance in machine learning\nThe most obvious answer is since model interaction with the minor class during training is less, we can improve that by adding more minor classes to the model. But how? We have a few methods:\n  1. Collecting more data for the minor class - This is a theoretically easy and practically infeasible solution. Because it's hard to do this while covering the business's actual needs, as an example, we may have to change the logic to get more customers into the churn category.\n  2. Random Oversampling - We can duplicate minor classes till we get a decent class distribution. It may result in the model learning inaccurate churn scenarios. In simple words, it will over-learn little incident patterns.\n  3. Random Undersampling - We can remove the samples from the majority classes to balance the dataset. However, it will remove some signals from the dataset. Also, if our dataset is highly imbalanced (minor samples are less than 1%), we may have to remove significant majority class samples from our dataset to make it more balanced.\n  4. We can generate synthetic data - We will focus on this more deeply in this article.\n\n\n## Generating synthetic data for rebalancing the dataset\nThe basic idea behind this is to generate more minor class samples similar to the existing ones in the minority class. But unlike repeating minor class instances multiple times, this will generate new minor class instances based on the dataset we have. For that SMOTE (Synthetic Minority Oversampling Technique) method is commonly used. But there are many alternatives for that, such as...\n  1. ADASYN (Adaptive Synthetic Sampling)\n  2. Tomek Links: This technique removes samples from the majority class that are very close to examples in the minority class. The idea is to remove easy cases from the majority class that will likely be misclassified as the minority class.\n  3. Near Miss: This technique selects samples from the majority classes closest in feature space to examples in the minority class and removes them from the dataset. The idea is similar to Tomek Links, but instead of eliminating easy cases from the majority class, it removes samples most likely to be misclassified as the minority class.\n\n\nLet's do some experiments around SMOTE.\nFirst, import the dataset. Here I am using a _Wine Quality dataset_ _**,**__and you can access the dataset using_[ _this_](https://zenodo.org/record/61452#.Y7OfjHZBzrd) _link_. Let's load the dataset and plot the class distribution.\npython\n\n```\nimport pandas as pd\nimport numpy as np\n\n#read the dataset\ndata = np.load('x20data.npz')\n\ndf = pd.DataFrame(data['data'])\ndf['target'] = data['label']\ndf['target'] = df['target'].replace(-1,0)\n\n#lets plot class distribution\ndf['target']\n.value_counts(normalize=True)\n.plot\n.bar(figsize=(10,6),alpha=0.6)\n\nplt.xlabel(\"Label\")\nplt.ylabel(\"Distribution %\")\nplt.yticks(list(np.linspace(0,1,11)))\nplt.grid(True)\nplt.show()\n```\n\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1sm1wugPgxcZYNwIzeKvCwA.png)\nImage by Author\nNow we can use the imblearn library to perform SMOTE on our dataset. In the below code, we will do SMOTE on our dataset and plot both the original and resamples versions of the dataset.\npython\n\n```\nimport matplotlib.pyplot as plt\nfrom sklearn.manifold import TSNE\nfrom imblearn.over_sampling import SMOTE\n\n# Set the font family for matplotlib\nplt.rcParams['font.family'] = 'Verdana'\n\n# Split your data into features and labels\nX = df.drop('target', axis=1)\ny = df['target']\n\n# Define the SMOTE resampling method\nsmote = SMOTE(random_state=42)\n\n# Resample the data using SMOTE\nX_resampled, y_resampled = smote.fit_resample(X, y)\n\n# Use TSNE for dimensionalilty reduction\nX_tsne = TSNE(n_components=2).fit_transform(X)\nX_resampled_tsne = TSNE(n_components=2).fit_transform(X_resampled)\n\n# Get the class ratios\noriginal_class_ratio = np.bincount(y) / len(y)\nresampled_class_ratio = np.bincount(y_resampled) / len(y_resampled)\n\n# Create subplots\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))\n\n# Plot the original data\nax1.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='rainbow',alpha=0.4)\nax1.set_title(f'Original DatanClass Ratio: {original_class_ratio[1] * 100:.1f} : {original_class_ratio[0] * 100:.1f}')\n\n# Plot the resampled data\nax2.scatter(X_resampled_tsne[:, 0], X_resampled_tsne[:, 1], c=y_resampled, cmap='rainbow',alpha=0.4)\nax2.set_title(f'Resampled DatanClass Ratio: {resampled_class_ratio[1] * 100:.0f} : {resampled_class_ratio[0] * 100:.0f}')\n\nplt.show()\n```\n\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1oPd8x7383wqkPvil7LnZuA.png)\nImage by Author\nAs you can see in the plots, we have converted 220 original minor incidents into 2152, its ~9x increase. That's where the problem lies. Let's focus on our specific churn problem.\n  1. Generating such fake customer data can lead the model to learn patterns that do not exist in the real world.\n  2. In most cases, we have quality issues in the dataset. As a result, there is a high chance of adding noises into datasets. Generating new data using noisy data is a bad idea.\n\n\nWith these potential issues, we have the below question in front.\n> Are we gonna deploy these models into production?\nIf it's a churn or fraud detection problem, I will not deploy it on production because these customer data can become noisier after applying SMOTE. But the answer to the above question highly depends on the data and business problem we are working on. Generally, it's not a good idea to rely on SMOTE when data is noisy and the problem is complex.\nLet's build a classifier using oversampled data and evaluate the model.\npython\n\n```\nfrom sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve, ConfusionMatrixDisplay\n\ndef plot_confusion_matrix_and_roc(model,df):\n\n    \"\"\"Helper function for plotting model performances\"\"\"    \n\n    # Make predictions on the holdout set\n\n    X,y = df.drop('target',axis=1), df['target']\n\n    y_pred = model.predict(X)\n\n    # Create the confusion matrix\n    cm = confusion_matrix(y, y_pred)\n\n    # Calculate the AUC ROC score\n    auc = roc_auc_score(y, y_pred)\n\n    # Get the FPR and TPR for the ROC curve\n    fpr, tpr, thresholds = roc_curve(y, y_pred)\n\n    # Create a figure with two subplots\n    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))\n\n    # Plot the confusion matrix\n    ax1.matshow(cm, cmap='Blues')\n    ax1.set_title('Confusion Matrix')\n    ax1.set_xlabel('Predicted')\n    ax1.set_ylabel('Actual')\n\n        # Add labels to the confusion matrix\n    # for i in range(cm.shape[0]):\n    #     for j in range(cm.shape[1]):\n    #         ax1.text(j, i, f'{cm[i, j]:n}', ha='center', va='center')\n\n    # Add labels for the TP, FP, TN, and FN cells\n    ax1.text(0, 0, f'TN: {cm[0, 0]:n}', ha='center', va='center', color='w')\n    ax1.text(0, 1, f'FN: {cm[1, 0]:n}', ha='center', va='center', color='k')\n    ax1.text(1, 0, f'FP: {cm[0, 1]:n}', ha='center', va='center', color='k')\n    ax1.text(1, 1, f'TP: {cm[1, 1]:n}', ha='center', va='center', color='k')\n\n    # Plot the ROC curve\n    ax2.plot(fpr, tpr, label='AUC ROC = %0.2f' % auc)\n    ax2.plot([0, 1], [0, 1], 'k--')\n    ax2.set_title('ROC Curve')\n    ax2.set_xlabel('FPR')\n    ax2.set_ylabel('TPR')\n    ax2.legend()\n\n    plt.show()\n\n#train the model\n\nfrom xgboost import XGBClassifier\n\nmodel = XGBClassifier()\nmodel.fit(X_resampled,y_resampled)\n\nplot_confusion_matrix_and_roc(model,df_holdout)\n```\n\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1NTxrQjssMXZYEdsMnvgO_A.png)\nImage by Author\nNow it's time to experiment with other approaches for class imbalance. Below I have explained a few methods I have used to tackle imbalance problems.\n  1. Use class weights\n  2. Change evaluation metrics\n  3. Create more features by doing error analysis for the model\n  4. Use an unsupervised algorithm to detect clusters of the dataset.\n\n\nLet's dive deep into these methods.\n## Use class weights\nWhen training a model on a dataset with class imbalance, the loss function may be dominated by the majority class because it has more instances. It can cause the model to pay more attention to the majority class than the minority class. The main idea of class weights is assigning weights for each sample based on its class. It will give more weight to the minority class during training. Meaning the model will pay more attention to the minority class during training in an effort to improve its performance in that class.\n> In advance, class weights can be used to balance the loss function by assigning higher weights to the minority class, so that it has a greater impact on the loss function. This can help the model to better learn the characteristics of the minority class and improve its performance on it.\nMathematically, class weights are typically incorporated into the loss function by multiplying the loss for each example by the weight for its class. For example, suppose we have a dataset with two classes (0 and 1) and the following class weights:\nini\n\n```\nclass_weights = {0: 1, 1: 10}\n```\n\nThe loss function for a binary classification model might be defined as follows:\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1kp3D_LqyIxAjYCxGyFo2ow.png)\nImage by Author\nTo incorporate class weights into this loss function, we can modify it as follows:\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1POlfTtV2cTg_nKAvqreAOg.png)\nImage by Author\nNow, when the model is trained, the loss for each example will be multiplied by the class weight for its class. It will cause the model to pay more attention to the minority class since its samples will significantly impact the loss function.\nMost major machine learning models accept the _sample _weight_ parameter. Here is an example of how you can do this with the XGBoost library.\npython\n\n```\n# this will compute sample weight for us\nfrom sklearn.utils import compute_sample_weight\n\n#coputing class weights, this will be (num_samples_in_y,)\nsample_weights = compute_sample_weight(class_weight='balanced',y=y)\n\nmodel = XGBClassifier()\n\n# just plug sample weight parameter into your model\nmodel.fit(X,y,sample_weight=sample_weights)\n```\n\nOne thing to notice here is that sample weights can potentially lead to overfitting if the weights are too high. It's generally a good idea to try a range of weights and see which gives the best performance on the validation set.\nAlternatively, we can use the [scale_pos_weight](https://xgboost.readthedocs.io/en/stable/parameter.html) parameter in XGBoost as well. It will give you similar results.\nLet's quickly plot the above model performance.\n![Image by Author](https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/19_0abYNvnbcDL6YshB4aHQ.png)\nImage by Author\nIf you check the confusion matrix for the above two scenarios. In that case, you will notice high false positives in the oversampled scenario. We have fewer false positive predictions using class weights. It also reduced our true positives as well. So we have to tweak our approaches based on real business needs.\n## Change evaluation metrics\nMost libraries use accuracy as the default evaluation metric for classification tasks. It's okay for balanced problems. But imbalanced problems will lead the model to guess the majority class without learning any potential signals.\nFor example, say we have 97 non-churn customers and three churn customers. Building a model and using accuracy as an evaluation metric can achieve 97% accuracy by blindly predicting non-churn class for every 100 samples. As an easy fix, we can change the evaluation metric into something different. Precision, Recall, F1 Score, and Balanced Accuracy are a few best options for the imbalance classification task.\n## Create more features by doing error analysis for the model\nWhen your model performs poorly, we can use error analysis to find different data segments with varying performance levels. Let's take the previous churn example; we can find the model's error vs. customers' revenue bucket and identify revenue segments where the model is good and evil. Likewise, we can create an error analysis report with this information. After the error analysis report, we can determine possible new features which the model can use to distinguish the churner vs. the non-churner scenarios.\nFor example, if you know low revenue users are churning because of the \"XYZ\" reason, you can add that feature if it's not already in the model. Otherwise, you can perform feature engineering methods with that potential feature, such as binning the \"XYZ\" feature.\n## Use an unsupervised algorithm to detect clusters of the dataset\nOne of the powerful and popular approaches is segmentation. If we know some features that can be used for segregating data into different subgroups, we can use those features for the clustering model. After clustering, you will note various class imbalances in other groups. There are a few possible scenarios. Such as,\n  1. You may find subgroups only with one class. After verifying this customer behaviour, we can further skip modelling for this particular subgroup. It will reduce the imbalance of the whole dataset.\n  2. You may find a somewhat balanced distribution that is easy to model compared to the previous dataset.\n  3. Or, you may find subgroups with a highly imbalanced class distribution. But this is not lousy compared to the original distribution. The reason for this is this imbalance occurs in similar data points and can be a strong signal even though the distribution is imbalanced. For example, if we are working on a disease prediction model, it's a good idea to group people into subgroups based on age. If the general class imbalance is 2%, grouping on age will produce different class distributions for different subgroups. In the higher age group, this will be more balanced. In the middle and young age groups, this will be highly imbalanced. Since we are modelling each segment separately, the model can generalize to that particular segment well.\n\n\n## Conclusion\nThis article aims to show alternatives to treat class imbalance other than synthetic data generation. It's worth noting that some methods heavily depend on the data, problem type, and domain you are working on. It's always a good idea to experiment with a few different approaches and pick the best one for your problem.\nPlease find the citation and license information for the above dataset.\n  1. Citation: Lemaitre, G., Nogueira, F., Aridas, C. K., & Oliveira, D. V. R. (2016). Imbalanced dataset for benchmarking [Data set]. Zenodo. <https://doi.org/10.5281/zenodo.61452>\n  2. Dataset license : [Open Data Commons Open Database License v1.0](https://opendatacommons.org/licenses/odbl/1-0/)\n\n\nThanks for reading.\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](https://assets.insightmediagroup.io/media/1787657265628_qm714e.jpeg)\nWritten By\n## [Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\n[See all from Ransaka Ravihara](https://towardsdatascience.com/author/ransakaravihara/)\n[Class Imbalance](https://towardsdatascience.com/tag/class-imbalance/)[Data Science](https://towardsdatascience.com/tag/data-science/)[Machine Learning](https://towardsdatascience.com/tag/machine-learning/)[Python](https://towardsdatascience.com/tag/python/)[Synthetic Data](https://towardsdatascience.com/tag/synthetic-data/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F&title=SMOTE%20and%20Other%20Options%3A%20A%20Comprehensive%20Guide%20to%20Handling%20Imbalanced%20Data)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F&title=SMOTE%20and%20Other%20Options%3A%20A%20Comprehensive%20Guide%20to%20Handling%20Imbalanced%20Data)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F&text=SMOTE%20and%20Other%20Options%3A%20A%20Comprehensive%20Guide%20to%20Handling%20Imbalanced%20Data)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/01/0dfwdKPWYmnvnVijz-scaled.jpeg)](https://towardsdatascience.com/stock-price-analysis-with-pandas-and-altair-ef1e178cc744/)\n## [Stock Price Analysis with Pandas and Altair](https://towardsdatascience.com/stock-price-analysis-with-pandas-and-altair-ef1e178cc744/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nPractical guide for Pandas and Altair\n[Soner Yıldırım](https://towardsdatascience.com/author/sonery/)\nJanuary 1, 20215 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/12/0lCyw2-ezHsU6NzhJ-scaled.jpg)](https://towardsdatascience.com/indexing-for-sql-query-optimization-139b57db9fc6-2/)\n## [Indexing for SQL Query Optimization](https://towardsdatascience.com/indexing-for-sql-query-optimization-139b57db9fc6-2/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nTime to up your querying game!\n[Ashish Tomar](https://towardsdatascience.com/author/ashishtomar-60885/)\nDecember 1, 20208 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2019/09/1C9VQfd5qtQGAn0Zyb5Mlxg.png)](https://towardsdatascience.com/are-first-babies-more-likely-to-be-late-1b099b5796b6/)\n## [Are first babies more likely to be late?](https://towardsdatascience.com/are-first-babies-more-likely-to-be-late-1b099b5796b6/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nYes, and also more likely to be early. But just a little.\n[Allen Downey](https://towardsdatascience.com/author/downey_78309/)\nSeptember 9, 20195 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/1n5GOVxUwy2yS3PTTeIc9CA-scaled.jpeg)](https://towardsdatascience.com/ai-for-revenue-growth-using-ml-to-drive-more-valuable-pricing-89e8c790f795/)\n## [AI for revenue growth: using ML to drive more valuable pricing](https://towardsdatascience.com/ai-for-revenue-growth-using-ml-to-drive-more-valuable-pricing-89e8c790f795/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nHow a national fitness brand used machine learning to optimize pricing and grow revenue by 11%\n[Daniel Burke](https://towardsdatascience.com/author/db_57288/)\nAugust 4, 20209 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/06P1Ftvhu-7VN0WIK-scaled.jpg)](https://towardsdatascience.com/heres-how-i-learned-just-enough-programming-for-data-science-58389f50c570/)\n## [Here's how I Learned Just Enough Programming for Data Science](https://towardsdatascience.com/heres-how-i-learned-just-enough-programming-for-data-science-58389f50c570/)\n[Programming](https://towardsdatascience.com/category/programming/)\nHow to approach learning programming and best books I recommend\n[Dario Radečić](https://towardsdatascience.com/author/radecicdario/)\nAugust 2, 20205 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/10/1XbWd-4156MX_j_OuIAURkg-scaled.jpeg)](https://towardsdatascience.com/mathematical-understanding-of-bias-variance-tradeoff-9366dbc8439a/)\n## [Mathematical Understanding of Bias Variance Tradeoff](https://towardsdatascience.com/mathematical-understanding-of-bias-variance-tradeoff-9366dbc8439a/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nUnderstanding Bias-Variance Tradeoff from the equation\n[Lakshya](https://towardsdatascience.com/author/laksh-daksha09/)\nOctober 19, 20215 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/07/1dx0kYi0FpI2vqA0osyVw4Q-scaled.jpeg)](https://towardsdatascience.com/random-forest-in-simple-english-why-is-it-so-popular-3ba04d0374d/)\n## [Random Forest in Simple English: Why is it so popular?](https://towardsdatascience.com/random-forest-in-simple-english-why-is-it-so-popular-3ba04d0374d/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nEverything you wanted to know about the commonly used algorithm\n[Sharan Kumar Ravindran](https://towardsdatascience.com/author/rsharankumar/)\nJuly 15, 20215 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/06/0xOFpxdQtDeRfd4WX-scaled.jpg)](https://towardsdatascience.com/handling-criticism-at-work-as-a-data-scientist-a1ae74c4f07d/)\n## [Handling Criticism at Work as a Data Scientist](https://towardsdatascience.com/handling-criticism-at-work-as-a-data-scientist-a1ae74c4f07d/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nReflection and lessons from my performance review as a first-year data scientist\n[Jason Chong](https://towardsdatascience.com/author/chongjason/)\nJune 21, 20227 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/12/1l9gkfOPPHz2qtisTi_e3fQ-scaled.jpeg)](https://towardsdatascience.com/how-to-take-your-sql-from-zero-to-data-scientist-level-part-2-3-bc1cbb48299e/)\n## [How to Take Your SQL from Zero to Data Scientist Level - Part 2/3](https://towardsdatascience.com/how-to-take-your-sql-from-zero-to-data-scientist-level-part-2-3-bc1cbb48299e/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nThe ultimate guide for your SQL List: Learn the basic and advanced SQL queries that data scientists frequently use\n[Alex Vamvakaris](https://towardsdatascience.com/author/alex.vamvakaris.ds/)\nDecember 20, 202217 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\n####  Recommended Articles \nClose\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607631/image?etag=1781543525510&width=500&height=500) Critical Mistakes Companies Make When Integrating AI/ML into Their Processes ](https://towardsdatascience.com/critical-mistakes-companies-make-when-integrating-ai-ml-into-their-processes/ \"Critical Mistakes Companies Make When Integrating AI/ML into Their Processes\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ \"How Relevance Models Foreshadowed Transformers for NLP\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ \"Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ \"The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs\")\n\n\n",
  "metadata": {
    "title": "SMOTE and Other Options: A Comprehensive Guide to Handling Imbalanced Data | Towards Data Science",
    "description": "The guide on when to use and when not to use synthetic data to tackle the class imbalance",
    "keywords": null,
    "author": "Ransaka Ravihara",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "SMOTE and Other Options: A Comprehensive Guide to Handling Imbalanced Data",
    "og:description": "The guide on when to use and when not to use synthetic data to tackle the class imbalance",
    "og:url": "https://towardsdatascience.com/use-smote-with-caution-3fa015ba3bc5/",
    "og:site_name": "Towards Data Science",
    "og:image": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/0koERRrbi5thbuS5Y-scaled.jpg",
    "og:image:width": "2560",
    "og:image:height": "1707",
    "og:image:type": "image/jpeg",
    "twitter:card": "summary_large_image",
    "twitter:site": "@TDataScience",
    "twitter:creator": "@TDataScience",
    "twitter:label1": "Written by",
    "twitter:data1": "Ransaka Ravihara",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "10 min read",
    "article:published_time": "2023-01-03T04:49:09.000Z",
    "article:modified_time": "2023-01-03T04:49:09.000Z",
    "article:author": "https://towardsdatascience.com/author/ransakaravihara/"
  },
  "paywall": {
    "listed_paid": true,
    "detected": false,
    "marker": "",
    "public_only": true,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 202,
    "error": ""
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/4b5a9e0cafc8/code/block_000.txt",
      "chars": 417
    },
    {
      "language": "txt",
      "file": "attachments/4b5a9e0cafc8/code/block_001.txt",
      "chars": 1276
    },
    {
      "language": "txt",
      "file": "attachments/4b5a9e0cafc8/code/block_002.txt",
      "chars": 1773
    },
    {
      "language": "txt",
      "file": "attachments/4b5a9e0cafc8/code/block_003.txt",
      "chars": 30
    },
    {
      "language": "txt",
      "file": "attachments/4b5a9e0cafc8/code/block_004.txt",
      "chars": 338
    }
  ],
  "images": [
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/0koERRrbi5thbuS5Y-scaled.jpg",
      "alt": "Photo by 은 하 on Unsplash",
      "local_path": "attachments/4b5a9e0cafc8/images/000.jpg",
      "bytes": 217950,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1sm1wugPgxcZYNwIzeKvCwA.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/001.png",
      "bytes": 3787,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1oPd8x7383wqkPvil7LnZuA.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/002.png",
      "bytes": 133261,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1NTxrQjssMXZYEdsMnvgO_A.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/003.png",
      "bytes": 17217,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1kp3D_LqyIxAjYCxGyFo2ow.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/004.png",
      "bytes": 10024,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/1POlfTtV2cTg_nKAvqreAOg.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/005.png",
      "bytes": 7780,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2023/01/19_0abYNvnbcDL6YshB4aHQ.png",
      "alt": "Image by Author",
      "local_path": "attachments/4b5a9e0cafc8/images/006.png",
      "bytes": 17382,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/01/0dfwdKPWYmnvnVijz-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/007.jpeg",
      "bytes": 135754,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/12/0lCyw2-ezHsU6NzhJ-scaled.jpg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/008.jpg",
      "bytes": 226790,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2019/09/1C9VQfd5qtQGAn0Zyb5Mlxg.png",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/009.png",
      "bytes": 57968,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/1n5GOVxUwy2yS3PTTeIc9CA-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/010.jpeg",
      "bytes": 217319,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/08/06P1Ftvhu-7VN0WIK-scaled.jpg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/011.jpg",
      "bytes": 386150,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/10/1XbWd-4156MX_j_OuIAURkg-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/012.jpeg",
      "bytes": 337130,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/07/1dx0kYi0FpI2vqA0osyVw4Q-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/013.jpeg",
      "bytes": 844209,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/06/0xOFpxdQtDeRfd4WX-scaled.jpg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/014.jpg",
      "bytes": 993234,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/12/1l9gkfOPPHz2qtisTi_e3fQ-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/4b5a9e0cafc8/images/015.jpeg",
      "bytes": 665984,
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [
    {
      "src": "https://www.youtube.com/c/TowardsDataScience",
      "quality": "unavailable",
      "local_path": "",
      "note": "无1080p且无720p，未交付更低清晰度"
    }
  ],
  "links": [
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/latest/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/editors-pick/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/the-variable/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/shipai/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/submissions/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/data-science/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/ransakaravihara/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/class-imbalance/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/data-science/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/machine-learning/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/python/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/synthetic-data/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/stock-price-analysis-with-pandas-and-altair-ef1e178cc744/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/artificial-intelligence/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/sonery/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/indexing-for-sql-query-optimization-139b57db9fc6-2/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/ashishtomar-60885/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/are-first-babies-more-likely-to-be-late-1b099b5796b6/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/downey_78309/"
    },
    {
      "type": "external",
      "href": "https://write.insightmediagroup.io"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/company/towards-data-science/"
    },
    {
      "type": "external",
      "href": "https://x.com/TDataScience"
    },
    {
      "type": "external",
      "href": "https://unsplash.com/@b0nn13_4nd_clyd3"
    },
    {
      "type": "external",
      "href": "https://unsplash.com"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/ai-data-scientist"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/machine-learning"
    },
    {
      "type": "external",
      "href": "https://zenodo.org/record/61452"
    },
    {
      "type": "external",
      "href": "https://xgboost.readthedocs.io/en/stable/parameter.html"
    },
    {
      "type": "external",
      "href": "https://doi.org/10.5281/zenodo.61452"
    },
    {
      "type": "external",
      "href": "https://opendatacommons.org/licenses/odbl/1-0/"
    },
    {
      "type": "external",
      "href": "https://www.facebook.com/sharer/sharer.php?title=SMOTE+and+Other+Options%3A+A+Comprehensive+Guide+to+Handling+Imbalanced+Data&u=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/shareArticle?mini=true&title=SMOTE+and+Other+Options%3A+A+Comprehensive+Guide+to+Handling+Imbalanced+Data&url=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F"
    },
    {
      "type": "external",
      "href": "https://x.com/share?text=SMOTE+and+Other+Options%3A+A+Comprehensive+Guide+to+Handling+Imbalanced+Data&url=https%3A%2F%2Ftowardsdatascience.com%2Fuse-smote-with-caution-3fa015ba3bc5%2F"
    },
    {
      "type": "external",
      "href": "https://www.youtube.com/c/TowardsDataScience"
    },
    {
      "type": "external",
      "href": "https://www.threads.net/@towardsdatascience"
    },
    {
      "type": "external",
      "href": "https://bsky.app/profile/towardsdatascience.com"
    },
    {
      "type": "external",
      "href": "https://thenewstack.io"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh"
    },
    {
      "type": "external",
      "href": "https://insightmediagroup.io/creator-network"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T11:11:49Z",
  "source_url": "https://towardsdatascience.com/use-smote-with-caution-3fa015ba3bc5/",
  "delivery_status": "excluded_paid",
  "discovery_status": "excluded_paid",
  "missing_reason": "按原约定排除付费/会员全文"
}