資料探勘比賽預備知識
檢視特徵的數值型別有哪些,物件型別有哪些:
- 特徵一般都是由類別型特徵和數值型特徵組成,而數值型特徵又分為連續型和離散型。
- 類別型特徵有時具有非數值關係,有時也具有數值關係。比如‘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視覺化曲線:
## 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())
)
相關文章
- 常用的機器學習&資料探勘知識(點)機器學習
- 資料探勘比賽/專案全流程介紹
- RMAN預備知識
- Java預備知識Java
- 資料探勘——認識資料
- 預備知識-python核心用法常用資料分析庫(上)Python
- 熱修復預備知識
- 資料探勘之預測篇
- 【Python資料探勘課程】五.線性迴歸知識及預測糖尿病例項Python
- 資料探勘-預測模型彙總模型
- 【乾貨】Kaggle 資料探勘比賽經驗分享(mark 專業的資料建模過程)
- UNDO表空間資料檔案丟失處理(一)預備知識
- FutureTask原始碼解析(1)——預備知識原始碼
- 資料探勘和知識發現的技術、方法及應用
- 資料探勘之資料準備——原始資料的特性
- 【大資料】你務必要搞清楚的十大資料探勘知識點大資料
- 資料探勘實戰 - 天池新人賽o2o優惠券使用預測
- 紐約如何利用資料探勘預防火災
- 【pandas】第一章 預備知識
- 計算語言學之預備知識
- 隨身雲資料探勘競賽解題思路
- 資料庫開發必備知識介紹資料庫
- 電子設計大賽需要具備的知識
- 資料探勘之產品預測任務
- 資料探勘與預測分析(第2版)
- 爬蟲必須得會的預備知識爬蟲
- datawhale打卡 第一章 預備知識
- 【Python資料探勘課程】六.Numpy、Pandas和Matplotlib包基礎知識Python
- 知識儲備
- 必備知識
- SQL隱碼攻擊預備知識-sql基礎SQL
- Python 入門【預備知識】---- Python 簡介Python
- Identity Server 4 預備知識 -- OAuth 2.0 簡介IDEServerOAuth
- 【筆記】動手學深度學習-預備知識筆記深度學習
- 【知識分享】如何預防伺服器資料丟失伺服器
- 大資料基礎知識全集,大資料愛好者收藏必備大資料
- 天池大資料比賽總結大資料
- Android小知識-剖析Retrofit前的預備知識(靜態代理與動態代理)Android