Я работаю со сложным набором данных, так как классы сильно разбалансированы и крайне некоррелированы. Набор имеет 96 000 значений, из которых менее 200 равны 1 с.
Я испробовал несколько методов, и с каждым из них точность и точность всегда были высокими, однако только несколько (менее 5) значений классифицируются как 1. Интересно, есть ли способ заставить машину классифицировать больше 1с. Если бы я мог правильно классифицировать только 25% времени, это был бы отличный результат.
Я пытался использовать параметр 'class weight' в произвольном лесу, но это, похоже, не влияет на результат.
import numpy as np
import pandas as pd
import sklearn as sklearn
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_pickle('/Users/shellyganga/Downloads/ola.pickle')
print(df.describe())
#filtering the df to improve results
df = df[(df['trip_duration'] > 5) & (df['Smooth_Driving_Score'] < 99)]
print(df.describe())
maxVal = 1
df.unsafe = df['unsafe'].where(df['unsafe'] <= maxVal, maxVal)
df.drop(df.columns[0], axis=1, inplace=True)
df.drop(df.columns[-2], axis=1, inplace=True)
#setting features and labels
labels = np.array(df['unsafe'])
features= df.drop('unsafe', axis = 1)
# Saving feature names for later use
feature_list = list(features.columns)
# Convert to numpy array
features = np.array(features)
from sklearn.model_selection import train_test_split
# 30% examples in test data
train, test, train_labels, test_labels = train_test_split(features, labels,
stratify = labels,
test_size = 0.4,
random_state = 12)
from sklearn.ensemble import RandomForestClassifier
# Create the model with 100 trees
model = RandomForestClassifier(n_estimators=100,
random_state=12,
max_features = 'sqrt',
n_jobs=-1, verbose = 1, class_weight={0:1, 1:1})
# Fit on training data
model.fit(train, train_labels)
predictions = model.predict(test)
print(np.mean(predictions))
print(predictions.shape)
from sklearn.metrics import classification_report
print(classification_report(test_labels, predictions)
Выход:
precision recall f1-score support
0 1.00 1.00 1.00 38300
1 1.00 0.01 0.02 90
avg / total 1.00 1.00 1.00 38390
Я пытался использовать {class_weight = 'balanced'}
и дал другой результат, но у меня проблемы с его пониманием.
micro avg 1.00 1.00 1.00 38390
macro avg 1.00 0.51 0.51 38390
weighted avg 1.00 1.00 1.00 38390
Откуда я знаю, сколько положительных результатов он предсказал?