Вот ссылка на набор данных, который я использовал: 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

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь: