Вот ссылка на набор данных, который я использовал: https://www.kaggle.com/datasets/amirhosseinmirzaie/americancitizenincome?resource=download. Набор данных состоит из демографической информации об американских людях. Более того, он содержит биологические, трудовые, образовательные и экономические элементы. Цель этого проекта — предсказать, будет ли годовой доход каждого гражданина больше (или меньше) 50 тысяч долларов. Во-первых, я проверил нулевые значения и нашел некоторые полезные статистические факторы для точек данных, такие как средний возраст граждан (38,60916 лет), средние потери капитала (87,489800) и среднее количество часов, которые они работают в неделю (40,442800 часов). . Чтобы найти лучшую модель для этого набора данных, я нарисовал несколько интересных цифр, чтобы понять корреляцию столбцов, поскольку я преобразовал категориальные значения дохода в целые числа. Первый — это связь между возрастом и доходом (мы можем гарантировать, что меньше людей имеют доход более 50 тысяч).
Также мы собираемся выяснить, играет ли пол важную роль в нашем целевом значении:
Мы видим, что мужчины получают более высокую зарплату, чем женщины, и большинство наиболее высокооплачиваемых сотрудников — мужчины. Более того, мы можем с уверенностью утверждать, что высшее образование предлагает людям больше денег:
Мы также можем увидеть связь между семейным положением и зарплатой:
На приведенной выше диаграмме показано, что женатым людям, как правило, платят выше. После анализа данных и связи между ними последнее, что нужно сделать перед созданием модели машинного обучения, — это создать фиктивные значения для категориальных значений. В этой статье я собираюсь использовать классификатор KNN, чтобы предсказать, превысит ли зарплата человека 50 тысяч долларов. В этом направлении я использую технику карты для горячего кодирования высокой зарплаты как 1 и низкой как 0. Позже я разделил набор данных для обучения и тестирования данных в пропорции 80:20. Для лучшего параметра модели я использовал метрику точности и нашел лучшее значение для k.
Из приведенного выше графика мы видим, что лучший параметр — 5 соседей. Мы легко видим, что точность модели составляет около 85%. Масштабирование не может реально улучшить нашу точность, поскольку значения в большинстве столбцов равны 0 и 1. Итак, мы собираемся использовать пакетирование. Оно включает в себя обучение нескольких моделей на разных подмножествах обучающих данных, а затем объединение их прогнозов посредством усреднения или голосования. Для KNN я создал ансамбль моделей KNN, каждая из которых обучалась на различном случайном подмножестве обучающих данных, с повышением точности до 0,8995680345572354. Я также распечатал отчет о классификации и матрицу путаницы, как показано ниже:
Код приведенной выше реализации приведен ниже:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier from sklearn.metrics import confusion_matrix, classifica-tion_report df = pd.read_csv("income.csv") print(df.head()) print(df.describe()) print(df.isnull().sum()) #df["income"] = df["income"].map({"<=50K":0, ">50K":1}) print(df.head()) #plt.figure(1) #plt.scatter(df["income"], df["age"]) plt.figure(1) plt.figure(figsize=(10, 6)) sns.countplot(data=df, x='income', palette={'<=50K': 'red', '>50K': 'blue'}) plt.xlabel('Income') plt.ylabel('Count') plt.title('Income Distribution by Age') for column_name in df.columns: value_to_drop = "?" # Drop rows containing the specific value in the column df = df[df[column_name] != value_to_drop] print(column_name,(df[column_name]=="?").sum()) plt.figure(2) #print((df["age"]=="?").sum()) plt.figure(figsize=(10, 6)) sns.catplot(data=df, x='income', hue='sex', kind='count', pal-ette='Set2') plt.xlabel('Income') plt.ylabel('Count') plt.title('Income by sex') plt.figure(3) plt.figure(figsize=(10, 6)) sns.catplot(data=df, x='income', hue='education', kind='count', palette='Set2') plt.xlabel('Income') plt.ylabel('Count') plt.title('Income by education') plt.figure(4) plt.figure(figsize=(10, 6)) sns.catplot(data=df, x='income', hue='workclass', kind='count', palette='Set2') plt.xlabel('Income') plt.ylabel('Count') plt.title('Income by workclass') plt.figure(4) plt.figure(figsize=(10, 6)) sns.catplot(data=df, x='income', hue='marital.status', kind='count', palette='Set2') plt.xlabel('Income') plt.ylabel('Count') plt.title('Income by marital.status') print(df.info()) def one_hot_encode(df, column_name): dummies = pd.get_dummies(df[column_name], pre-fix=column_name) df = pd.concat([df, dummies], axis=1) df.drop(column_name, axis=1, inplace=True) return df # List of categorical columns to be one-hot encoded categorical_columns = ['workclass', 'marital.status', 'occupa-tion', 'relationship', 'sex'] columns_to_drop = ['native.country', 'race', 'educa-tion','fnlwgt'] df = df.drop(columns=columns_to_drop) df["income"] = df["income"].map({"<=50K":0, ">50K":1}) # Apply one-hot encoding function to each categorical column for col in categorical_columns: df = one_hot_encode(df, col) # Convert boolean columns to integers (0 and 1) df = df.astype(int) print(df.info()) X = df.drop(["income"], axis=1) y = df.pop('income') xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.2, random_state=42) k_values = list(range(1, 21)) # Initialize lists to store accuracies for each k accuracies = [] for k in k_values: # Create a KNN classifier with k neighbors knn = KNeighborsClassifier(n_neighbors=k) # Fit the classifier on the training data knn.fit(xtrain, ytrain) # Predict on the test data y_pred = knn.predict(xtest) # Calculate accuracy and store it accuracy = accuracy_score(ytest, y_pred) accuracies.append(accuracy) # Plotting the accuracy vs. k values plt.figure(figsize=(10, 6)) plt.plot(k_values, accuracies, marker='o') plt.title('Accuracy vs. Number of Neighbors (k) in KNN Classi-fier') plt.xlabel('Number of Neighbors (k)') plt.ylabel('Accuracy') plt.xticks(k_values) plt.grid(True) plt.show() knn = KNeighborsClassifier(n_neighbors=5) # Initialize the BaggingClassifier with KNN base estimator bagging = BaggingClassifier(base_estimator=knn, n_estimators=50, random_state=42) # Fit the BaggingClassifier on the data bagging.fit(X, y) # Make predictions using the ensemble model predictions = bagging.predict(xtest) print(accuracy_score(ytest, predictions)) cm = confusion_matrix(ytest, predictions) print(cm) print(classification_report(ytest,predictions))
И последнее, но не менее важное: мы видим, что наша модель проста, но эффективна в прогнозировании годового дохода с точностью до 90%. Этот высокий процент обусловлен устранением шума, поскольку этот алгоритм очень чувствителен к выбросам. Я также создал больше моделей с меньшей точностью (около 80%), которые можно найти по следующей ссылке: https://colab. Research.google.com/drive/1s_b5zTIgzNewD-a3M16cKAMwmSbqmAOz#scrollTo=SEleeaUMH_NH
Сообщение от AI Mind
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Аплодируйте истории и подписывайтесь на автора 👉
- 📰 Больше контента смотрите в AI Mind Publication
- 🧠 Улучшайте свои подсказки AI легко и БЕСПЛАТНО
- 🧰 Откройте для себя Интуитивные инструменты искусственного интеллекта