Тестовые данные, показывающие 100% точность - PullRequest
0 голосов
/ 17 января 2020
from sklearn.utils import shuffle
df_concat = shuffle(df_concat)
df = df_concat

X = df.loc[:, df.columns != 'NEWACCT_NO']
X = X.loc[:, X.columns != 'CURRENT_MTH_CHURN']
X = X.values
y = df.CURRENT_MTH_CHURN.values # Target variable


from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 1)

#Train the model with the help of DecisionTreeClassifie
clf = DecisionTreeClassifier(class_weight="balanced")
clf = clf.fit(X_train,y_train)

#At last we need to make prediction. It can be done with the help of following script −
y_pred = clf.predict(X_test)


#Next, we can get the accuracy score, confusion matrix and classification report as follows −
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

Вывод:

Confusion Matrix:
[[8238    0]
 [   0 1066]]
Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00      8238
           1       1.00      1.00      1.00      1066

    accuracy                           1.00      9304
   macro avg       1.00      1.00      1.00      9304
weighted avg       1.00      1.00      1.00      9304

Accuracy: 1.0

Несмотря на то, что train_test_split делит обучающие и тестовые данные случайным образом, кроме этого, я также использовал sklearn.utils shuffle, но все равно получаю 100% точность на тестовых данных.

Невозможно определить ошибку.

Также попытался удалить параметр class_weight = "сбалансированный", но результаты те же.

Требуется совет экспертов, пожалуйста .

Ответы [ 2 ]

3 голосов
/ 17 января 2020

вы разбиваете свои данные на обучающие и тестируемые, но, очевидно, все ваши функции генерации уже были выполнены перед этим кодом. Поэтому, если какой-либо из ваших кодов генерации объектов предполагает использование вашей зависимой переменной каким-либо образом (например, переменную типа mean_churn_per_account_type или что-то в этом роде), это означает, что функции набора поездов включают информацию из зависимой переменной вашего набора тестов. В ML это называется «утечкой данных» - вы передавали данные набора тестов в набор поездов с помощью функций, созданных до разделения теста.

Чтобы это исправить, необходимо перенести тест поезда разделите все этапы генерации объектов, в которых участвует ваша зависимая переменная. Применение ваших шагов генерации функций одинаково для обучения и тестирования набора может привести к путанице - но использование sklearn pipe поможет.

Отказ от ответственности: это все предположение, так как мы не можем на самом деле увидеть ваш код генерации функций. Но по моему опыту это наиболее вероятный источник.

0 голосов
/ 17 января 2020

Ааа, как и предполагалось, я проверил матрицу корреляции и узнал, что существует переменная с именем "IMAGE", которая имеет корреляцию -0,86 с переменной CHURN.

Как только я удалил ее, был удалось достичь удовлетворительного результата:

print(classification_report(test_output_smote, test_prediction_upsampled_smote))
              precision    recall  f1-score   support

           N       0.74      0.84      0.79      8233
           Y       0.81      0.71      0.76      8233

    accuracy                           0.78     16466
   macro avg       0.78      0.78      0.77     16466
weighted avg       0.78      0.78      0.77     16466

Спасибо всем за помощь и поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...