一. 模型解释
作为一种查看哪些变量最相关的简单方法,我们可以查看随机森林的特征输入。
鉴于我们在探索性数据分析中看到的相关性,我们应该预期最重要的特性是EXT_SOURCE和DAYS_BIRTH。
在未来的工作中,我们可能会使用这些特征输入作为降维的方法。
# 导入基本处理模块
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import os
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import seaborn as sns
# 输入处理缺失值
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
app_train = pd.read_csv('E:/home_credit_default_risk/application_train.csv')
app_test = pd.read_csv('E:/home_credit_default_risk/application_test.csv')
train_labels = app_train['TARGET']
app_train = app_train.select_dtypes(['number'])
app_test = app_test.select_dtypes(['number'])
# 从训练数据中删除目标
if 'TARGET' in app_train:
train = app_train.drop(columns=['TARGET'])
else:
train = app_train.copy()
# 特征名称
features = list(train.columns)
# 复制测试集
test = app_test.copy()
# 缺失值的中值估算
imputer = SimpleImputer(strategy='median')
# 将每个特性缩放到0-1
scaler = MinMaxScaler(feature_range=(0, 1))
# 符合训练数据
imputer.fit(train)
# 转换训练和测试数据
train = imputer.transform(train)
test = imputer.transform(app_test)
# 重复的标量
scaler.fit(train)
train = scaler.transform(train)
test = scaler.transform(test)
from sklearn.ensemble import RandomForestClassifier
# 建立随机森林分类器
random_forest = RandomForestClassifier(n_estimators = 100, random_state = 50, verbose = 1, n_jobs = -1)
# Train on the training data
random_forest.fit(train, train_labels)
# 提取重要特征
feature_importance_values = random_forest.feature_importances_
feature_importances = pd.DataFrame({'feature': features, 'importance': feature_importance_values})
# 对测试数据进行预测
predictions = random_forest.predict_proba(test)[:, 1]
# 做一个提交用的dataframe
submit = app_test[['SK_ID_CURR']]
submit['TARGET'] = predictions
def plot_feature_importances(df):
"""
由平面图测量模型的重要性。这可以用任何测量
如果重要性越高越好,那么特征的重要性就越大。
参数:
df(dataframe):功能重要性。必须在列中包含特征吗
在一个名为“重要性”的专栏中,它被称为“特征”和“重要性”
返回:
显示了15个最重要的特征
df (dataframe):按特征的重要性进行排序(最高到最低)
带有一列表示归一化重要性
"""
# 按特征的重要性进行排序
df = df.sort_values('importance', ascending=False).reset_index()
# 对特性的重要性进行规范化,使其加起来为1
df['importance_normalized'] = df['importance'] / df['importance'].sum()
# 制作测量特征的水平条形图
plt.figure(figsize=(10, 6))
ax = plt.subplot()
# 需要反向索引绘制最重要的顶部
ax.barh(list(reversed(list(df.index[:15]))),
df['importance_normalized'].head(15),
align='center', edgecolor='k')
# 设置y轴刻度和标签
ax.set_yticks(list(reversed(list(df.index[:15]))))
ax.set_yticklabels(df['feature'].head(15))
# 平面图的标签
plt.xlabel('Normalized Importance');
plt.title('Feature Importances')
plt.show()
return df
# 将特征重要性显示为默认的
feature_importances_sorted = plot_feature_importances(feature_importances)
image.png
我们看到,我们所有的四个自己设计的功能都使它进入了前15个最重要的!这能使我们确信,我们的领域知识至少有部分走上了正轨。
网友评论