資料探勘比賽預備知識

我會像蝸牛一樣努力發表於2020-11-03

檢視特徵的數值型別有哪些,物件型別有哪些:

  • 特徵一般都是由類別型特徵和數值型特徵組成,而數值型特徵又分為連續型和離散型。
  • 類別型特徵有時具有非數值關係,有時也具有數值關係。比如‘grade’中的等級A,B,C等,是否只是單純的分類,還是A優於其他要結合業務判斷。
  • 數值型特徵本是可以直接入模的,但往往風控人員要對其做分箱,轉化為WOE編碼進而做標準評分卡等操作。從模型效果上來看,特徵分箱主要是為了降低變數的複雜性,減少變數噪音對模型的影響,提高自變數和因變數的相關度。從而使模型更加穩定。
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))

劃分數值型變數中的連續變數和離散型變數:

#過濾數值型類別特徵
def get_numerical_serial_fea(data,feas):
    numerical_serial_fea = []
    numerical_noserial_fea = []
    for fea in feas:
        temp = data[fea].nunique()
        #取值數少於10的類別認為數值型類別特徵
        if temp <= 10:
            numerical_noserial_fea.append(fea)
            continue
        numerical_serial_fea.append(fea)
    return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(data_train,numerical_fea)

數值連續型變數視覺化分析:

#每個數字特徵得分佈視覺化
f = pd.melt(data_train, value_vars=numerical_serial_fea)
""
col表示值的名稱
col_wrap表示一行顯示2個子圖
sharex、sharey表示是否恭喜x、y軸
""
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")

檢視資料集中特徵缺失值,唯一值等:

缺失值:

print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')

上面得到訓練集有22列特徵有缺失值,進一步檢視缺失特徵中缺失率大於50%的特徵

have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
fea_null_moreThanHalf = {}
for key,value in have_null_fea_dict.items():
    if value > 0.5:
        fea_null_moreThanHalf[key] = value

 檢視資料集中特徵屬性只有一值的特徵:

one_value_fea = [col for col in data_train.columns if data_train[col].nunique() <= 1]

視覺化缺失特徵及缺失率:

# nan視覺化
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
  • 縱向瞭解哪些列存在 “nan”, 並可以把nan的個數列印,主要的目的在於檢視某一列nan存在的個數是否真的很大,如果nan存在的過多,說明這一列對label的影響幾乎不起作用了,可以考慮刪掉。如果缺失值很小一般可以選擇填充。
  • 另外可以橫向比較,如果在資料集中,某些樣本資料的大部分列都是缺失的且樣本足夠的情況下可以考慮刪除。

Tips: 比賽大殺器lgb模型可以自動處理缺失值。

msno視覺化缺失值: 

msno.matrix(Train_data.sample(250))

 

msno.bar(Train_data.sample(1000))

 

視覺化數值型變數及其log處理:

  • 檢視某一個數值型變數的分佈,檢視變數是否符合正態分佈,如果不符合正太分佈的變數可以log化後再觀察下是否符合正態分佈。
  • 如果想統一處理一批資料變標準化 必須把這些之前已經正態化的資料提出。
  • 正態化的原因:一些情況下正態非正態可以讓模型更快的收斂,一些模型要求資料正態(eg. GMM、KNN),保證資料不要過偏態即可,過於偏態可能會影響模型預測結果。
#Ploting Transaction Amount Values Distribution
plt.figure(figsize=(16,12))
plt.suptitle('Transaction Values Distribution', fontsize=22)
plt.subplot(221)
sub_plot_1 = sns.distplot(data_train['loanAmnt'])
sub_plot_1.set_title("loanAmnt Distribuition", fontsize=18)
sub_plot_1.set_xlabel("")
sub_plot_1.set_ylabel("Probability", fontsize=15)

plt.subplot(222)
sub_plot_2 = sns.distplot(np.log(data_train['loanAmnt']))
sub_plot_2.set_title("loanAmnt (Log) Distribuition", fontsize=18)
sub_plot_2.set_xlabel("")
sub_plot_2.set_ylabel("Probability", fontsize=15)

類別型變數分佈視覺化:

plt.figure(figsize=(8, 8))
sns.barplot(data_train["employmentLength"].value_counts(dropna=False)[:20],
            data_train["employmentLength"].value_counts(dropna=False).keys()[:20])
plt.show()

視覺化類別型變數在不同y值上的分佈:

train_loan_fr = data_train.loc[data_train['isDefault'] == 1]
train_loan_nofr = data_train.loc[data_train['isDefault'] == 0]

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 8))
train_loan_fr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax1, title='Count of grade fraud')
train_loan_nofr.groupby('grade')['grade'].count().plot(kind='barh', ax=ax2, title='Count of grade non-fraud')
train_loan_fr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax3, title='Count of employmentLength fraud')
train_loan_nofr.groupby('employmentLength')['employmentLength'].count().plot(kind='barh', ax=ax4, title='Count of employmentLength non-fraud')
plt.show()

視覺化連續型變數在不同y值上的分佈:

fig, ((ax1, ax2)) = plt.subplots(1, 2, figsize=(15, 6))
data_train.loc[data_train['isDefault'] == 1]['loanAmnt'].apply(np.log) \
    .plot(kind='hist',
          bins=100,
          title='Log Loan Amt - Fraud',
          color='r',
          xlim=(-3, 10),
         ax= ax1)
data_train.loc[data_train['isDefault'] == 0]['loanAmnt'].apply(np.log) \
    .plot(kind='hist',
          bins=100,
          title='Log Loan Amt - Not Fraud',
          color='b',
          xlim=(-3, 10),
         ax=ax2)

 時間格式資料處理及視覺化:

#轉化成時間格式  issueDateDT特徵表示資料日期離資料集中日期最早的日期(2007-06-01)的天數
data_train['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
data_train['issueDateDT'] = data_train['issueDate'].apply(lambda x: x-startdate).dt.days

#轉化成時間格式
data_test_a['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
data_test_a['issueDateDT'] = data_test_a['issueDate'].apply(lambda x: x-startdate).dt.days

plt.hist(data_train['issueDateDT'], label='train')
plt.hist(data_test_a['issueDateDT'], label='test')
plt.legend()
plt.title('Distribution of issueDateDT dates')
#train 和 test issueDateDT 日期有重疊 所以使用基於時間的分割進行驗證是不明智的

運用確定值填補空缺值:

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

擬合Label視覺化曲線:

sns庫參考部落格

## 1) 總體分佈概況(無界約翰遜分佈等)
import scipy.stats as st
y = Train_data['price']
plt.figure(1)
plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)
plt.figure(2)
plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3)
plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)

Label不服從正態分佈,所以在進行迴歸之前,它必須進行轉換。雖然對數變換做得很好,但最佳擬合是無界約翰遜分佈

相關性分析及其視覺化:

price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')

f , ax = plt.subplots(figsize = (7, 7))

plt.title('Correlation of Numeric Features with Price',y=1,size=16)

sns.heatmap(correlation,square = True,  vmax=0.8)

 

檢視數值特徵的偏度和峰度:

# 2) 檢視幾個特徵得 偏度和峰值
for col in numeric_features:
    print('{:15}'.format(col), 
          'Skewness: {:05.2f}'.format(Train_data[col].skew()) , 
          '   ' ,
          'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())  
         )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章