構建數據的歸一化和標準化(某金融數據集)

導入各種包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,roc_auc_score,roc_curve,auc
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.linear_model import LogisticRegression
from  sklearn import svm
from sklearn.tree import DecisionTreeClassifier

導入數據

data=pd.read_csv('./data.csv',index_col=0,encoding='gbk')

數據理解

#單獨提取出y列標籤,和其餘的88列標記爲x
y=data['status']
X=data.drop('status',axis=1)
#X值的行列數,以及y的分佈類型
print('X.shape:',X.shape)
print('y的分佈:',y.value_counts())
X.shape: (4754, 88)
y的分佈: 0    3561
1    1193
Name: status, dtype: int64

數據準備(添加數據標準化或歸一化)

#首先剔除一些明顯無用的特徵,如id_name,custid,trade_no,bank_card_no
X.drop(['id_name','custid','trade_no','bank_card_no'],axis=1,inplace=True)
print(X.shape)
#選取數值型特徵
X_num=X.select_dtypes('number').copy()
print(X_num.shape)
type(X_num.mean())
#使用均值填充缺失值
X_num.fillna(X_num.mean(),inplace=True)
#觀察數值型以外的變量
X_str=X.select_dtypes(exclude='number').copy()
X_str.describe()
#把reg_preference用虛擬變量代替,其它三個變量刪除
X_str['reg_preference_for_trad'] = X_str['reg_preference_for_trad'].fillna(X_str['reg_preference_for_trad'].mode()[0])
X_str_dummy = pd.get_dummies(X_str['reg_preference_for_trad'])
X_str_dummy.head()
#合併數值型變量和名義型(字符型)變量
X_cl = pd.concat([X_num,X_str_dummy],axis=1,sort=False)
#X_cl.shape
X_cl.head()
"""
#數據標準化和歸一化
from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(X_cl)
"""
from sklearn import preprocessing
X_cl = preprocessing.scale(X_cl)

(4754, 84)
(4754, 80)
#以三七比例分割訓練集和測試集
random_state = 1118
X_train,X_test,y_train,y_test = train_test_split(X_cl,y,test_size=0.3,random_state=1118)
print(X_train.shape)
print(X_test.shape)

"""
#建立xgboost模型
xgboost_model=XGBClassifier()
xgboost_model.fit(X_train,y_train)

#用建立好的xgboost模型運用到訓練集和測試集上,進行預測
y_train_pred = xgboost_model.predict(X_train)
y_test_pred = xgboost_model.predict(X_test)



#建立邏輯迴歸模型
lr = LogisticRegression(C=0.09,random_state=0,penalty='l1')
lr.fit(X_train, y_train)
#用建立好的lr模型運用到訓練集和測試集上,進行預測
y_train_pred = lr.predict(X_train)
y_test_pred = lr.predict(X_test)
"""
Lin_SVC = svm.SVC(probability=True)
Lin_SVC.fit(X_train,y_train)
    
y_train_pred = Lin_SVC.predict(X_train)
y_test_pred = Lin_SVC.predict(X_test)





(3327, 85)
(1427, 85)

模型評估

print('訓練集:{:.4f}'.format(roc_auc_score(y_train, y_train_pred)))
print('測試集:{:.4f}'.format(roc_auc_score(y_test, y_test_pred)))
訓練集:1.0000
測試集:0.5000

總結:數據的歸一化對模型效果是有影響的,其中lr有提升,xgboost反而下降了一點(可能是樹模型自身對歸一化不敏感),svm在沒有歸一化時AUC始終爲0.5,歸一化後效果變好。
問題:嘗試lr模型懲罰函數用默認值l2,在不做數據歸一化時,效果很差,訓練集和測試集auc都=0.5,不知道爲什麼。改成l1是否做歸一化,影響就不大了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章