Dengan melakukan kejuruteraan ciri buatan tangan pada data mentah, kami boleh membawa ketepatan dan prestasi model ke tahap baharu, membuka jalan untuk ramalan yang lebih tepat dan keputusan perniagaan yang lebih bijak boleh dioptimumkan seperti sebelum ini dan meningkatkan keupayaan perniagaan.
Data mentah adalah seperti teka-teki jigsaw tanpa gambar - tetapi dengan kejuruteraan ciri, kita boleh menyatukan kepingan-kepingan itu, walaupun mempunyai sejumlah besar data benar-benar satu cabaran dalam pencarian untuk membina mesin Sebuah khazanah model pembelajaran untuk institusi kewangan, tetapi ia juga penting untuk mengakui bahawa tidak semua data adalah bermaklumat. Selain itu, ciri manual direka secara manual, dan sebab bagi setiap operasi boleh dijelaskan, yang juga membawa kebolehtafsiran.
Kejuruteraan ciri bukan hanya tentang memilih ciri terbaik. Ia juga melibatkan pengurangan hingar dan redundansi dalam data untuk meningkatkan keupayaan generalisasi model. Ini penting kerana model perlu berprestasi baik pada data yang tidak kelihatan untuk benar-benar berguna.
Dataset yang diterangkan dalam artikel ini telah dianonimkan dan disembunyikan untuk mengekalkan kerahsiaan data pelanggan. Ciri boleh dikelaskan seperti berikut:
D_* = 拖欠变量 S_* = 支出变量 P_* = 支付变量 B_* = 平衡变量 R_* = 风险变量
Terdapat sejumlah 100 ciri integer dan 100 ciri titik terapung yang mewakili status pelanggan sepanjang 12 bulan yang lalu. Set data ini mengandungi maklumat tentang laporan pelanggan antara 1 hingga 13. Mungkin terdapat jurang 30 hingga 180 hari antara setiap penyata kad kredit pelanggan (iaitu, penyata kad kredit pelanggan mungkin tiada). Setiap pelanggan diwakili oleh ID pelanggan. Data sampel 5 rekod pertama pelanggan dengan customer_ID=0 adalah seperti berikut:
Antara 7 juta customer_ID, 98% daripada label adalah "0" (baik pelanggan, tiada Lalai), 2% dilabel "1" (Pelanggan Buruk, Lalai).
Set data adalah besar, jadi kami menggunakan cudf untuk mempercepatkan pemprosesan, jika anda tidak mempunyai cudf yang dipasang, ia sama dengan panda
# LOAD LIBRARIES import pandas as pd, numpy as np # CPU libraries import cudf # GPU libraries import matplotlib.pyplot as plt, gc, os df = cudf.read_parquet('./data.parquet')
Terdapat ratusan Beberapa idea boleh digunakan untuk menjana ciri; tetapi kami juga memastikan ciri ini membantu meningkatkan prestasi model Rajah berikut menunjukkan beberapa kaedah asas yang digunakan dalam kejuruteraan ciri:
Pengagregatan ialah rahsia untuk memahami data yang kompleks. Dengan mengira statistik ringkasan untuk pembolehubah pengelompokan kategori seperti customer_ID (C_ID) atau kategori produk, atau pengagregatan pembolehubah berangka, kami boleh menemui corak dan aliran yang tidak kelihatan. Dengan statistik ringkasan seperti min, maksimum, minimum, sisihan piawai dan median, kami boleh membina model ramalan yang lebih tepat dan mengekstrak cerapan bermakna daripada data pelanggan, data transaksi atau mana-mana data berangka lain.
Atribut statistik ini boleh dikira untuk setiap pelanggan
cat_features = ["B_1","B_2","D_1","D_2","D_10","P_21","D_126","D_3","D_42","R_66","R_68"] num_features = [col for col in all_cols if col not in cat_features] #all features accept cateforical features. test_num_agg = df.groupby("customer_ID")[num_features].agg(['mean', 'std', 'min', 'max', 'last','median']) #grouping by customerID test_num_agg.columns = ['_'.join(x) for x in test_num_agg.columns]
Min: Nilai purata pembolehubah berangka yang memberikan pengertian umum tentang kecenderungan pusat data. Purata boleh menangkap:
Purata baki bank yang dimiliki pelanggan.
Sisihan Piawai (Std): Ukuran taburan data di sekeliling min, yang boleh memberikan cerapan tentang kebolehubahan data. Kebolehubahan yang tinggi dalam baki menunjukkan bahawa pelanggan sedang berbelanja.
Nilai minimum dan maksimum menangkap kekayaan pelanggan dan juga menangkap maklumat tentang perbelanjaan dan risiko pelanggan.
Median: Apabila data sangat condong, menggunakan min bukanlah idea yang lebih baik, jadi median boleh digunakan (tengah nilai boleh digunakan.
Terkini nilai mungkin Ciri yang paling penting, kerana ia mengandungi maklumat tentang penyata kredit terkini yang diketahui dikeluarkan kepada pelanggan, adalah status semasa akaun pelanggan
cat_features = ["B_1","B_2","D_1","D_2","D_10","P_21","D_126","D_3","D_42","R_66","R_68"] test_cat_agg = df.groupby("customer_ID")[cat_features].agg(['count', 'last', 'nunique']) test_cat_agg.columns = ['_'.join(x) for x in test_cat_agg.columns]
在预测客户行为方面,基于排名的特征是非常重要的。通过根据收入或支出等特定属性对客户进行排名,我们可以深入了解他们的财务习惯并更好地管理风险。
使用 cudf 的 rank 函数,我们可以轻松计算这些特征并使用它们来为预测提供信息。例如,可以根据客户的消费模式、债务收入比或信用评分对客户进行排名。然后这些特征可用于预测违约或识别有可能拖欠付款的客户。
基于排名的特征还可用于识别高价值客户、目标营销工作和优化贷款优惠。例如,可以根据客户接受贷款提议的可能性对客户进行排名,然后将排名最高的客户作为目标。
df[feat+'_rank']=df[feat].rank(pct=True, method='min')
PCT用于是否做百分位排名。客户的排名也可以基于分类特征来计算。
df[feat+'_rank']=df.groupby([cat_feat]).rank(pct=True, method='min')
特征组合的一种流行方法是线性或非线性组合。这包括采用两个或多个现有特征,将它们组合在一起创建一个新的复合特征。然后使用这个复合特征来识别单独查看单个特征时可能不可见的模式、趋势和相关性。
例如,假设我们正在分析客户消费习惯的数据集。可以从个人特征开始,比如年龄、收入和地点。但是通过以线性或非线性的方式组合这些特性,可以创建新的复合特性,使我们能够更多地了解客户。可以结合收入和位置来创建一个复合特征,该特征告诉我们某一地区客户的平均支出。
但是并不是所有的特征组合都有用。关键是要确定哪些组合与试图解决的问题最相关,这需要对数据和问题领域有深刻的理解,并仔细分析创建的复合特征和试图预测的目标变量之间的相关性。
下图展示了一个组合特征并将信息用于模型的过程。作为筛选条件,这里只选择那些与目标相关性大于最大值 0.9 的特征。
features=[col for col in train.columns if col not in ['customer_ID',target]+cat_features] for feat1 in features: for feat2 in features: th=max(np.corr(feat1,Y)[0],np.corr(feat1,Y)[0]) #calculate threshold feat3=df[feat1]-df[feat2] #difference feature corr3=np.corr(feat3,Y)[0] if(corr3>max(th,0.9)): #if correlation greater than max(th,0.9) we add it as feature df[feat1+'_'+feat2]=feat3
在数据分析方面,基于时间的特征非常重要。通过根据时间属性(例如月份或星期几)对数据进行分组,可以创建强大的特征。这些特征的范围可以从简单的平均值(如收入和支出)到更复杂的属性(如信用评分随时间的变化)。
借助基于时间的特征,还可以识别在孤立地查看数据时可能看不到的模式和趋势。下图演示了如何使用基于时间的特征来创建有用的复合属性。
首先,计算一个月内的值的平均值(可以使用该月的某天或该月的某周等),将获得的DF与原始数据合并,并取各个特征之间的差。
features=[col for col in train.columns if col not in ['customer_ID',target]+cat_features] month_Agg=df.groupby([month])[features].agg('mean')#grouping based on month feature month_Agg.columns = ['_month_'.join(x) for x in month_Agg.columns] month_Agg.reset_index(inplace=True) df=df.groupby(month_Agg,notallow='month') for feat in features: #create composite features b taking difference df[feat+'_'+feat+'_month_mean']=df[feat]-df[feat+'_month_mean']
还可以通过使用时间作为分组变量来创建基于排名的特征,如下所示
features=[col for col in train.columns if col not in ['customer_ID',target]+cat_features] month_Agg=df.groupby([month])[features].rank(pct=True) #grouping based on month feature month_Agg.columns = ['_month_'.join(x) for x in month_Agg.columns] month_Agg.reset_index(inplace=True) df=pd.concat([df,month_Agg],axis=1) #concat to original dataframe
滞后特征是有效预测金融数据的重要工具。这些特征包括计算时间序列中当前值与之前值之间的差值。通过将滞后特征纳入分析,可以更好地理解数据中的模式和趋势,并做出更准确的预测。
如果滞后特征显示客户连续几个月按时支付信用卡账单,可能会预测他们将来不太可能违约。相反,如果延迟特征显示客户一直延迟或错过付款,可能会预测他们更有可能违约。
# difference function calculate the lag difference for numerical features #between last value and shift last value. def difference(groups,num_features,shift): data=(groups[num_features].nth(-1)-groups[num_features].nth(-1*shift)).rename(columns={f: f"{f}_diff{shift}" for f in num_features}) return data #calculate diff features for last -2nd last, last -3rd last, last- 4th last def get_difference(data,num_features): print("diff features...") groups=data.groupby('customer_ID') df1=difference(groups,num_features,2).fillna(0) df2=difference(groups,num_features,3).fillna(0) df3=difference(groups,num_features,4).fillna(0) df1=pd.concat([df1,df2,df3],axis=1) df1.reset_index(inplace=True) df1.sort_values(by='customer_ID') del df2,df3 gc.collect() return df1train_diff = get_difference(df, num_features)
这些特征只是取最后3(4,5,…x)值的平均值,这取决于数据,因为基于时间的最新值携带了关于客户最新状态的信息。
xth=3 #define the window size df["cumulative"]=df.groupby('customer_ID').sort_values(by=['time'],ascending=False).cumcount() last_info=df[df["cumulative"]<=xth] last_info = last_info.groupby("customer_ID")[num_features].agg(['mean', 'std', 'min', 'max', 'last','median']) #grouping by customerID last_info.columns = ['_'.join(x) for x in last_info.columns]
上面的方法已经创建了足够多的特征来构建一个很棒的模型。但是根据数据的性质,还可以创建更多的特征。例如:可以创建像null计数这样的特征,它可以计算客户当前的总null值,从而帮助捕获基于树的算法无法理解的特征分布。
def calc_nan(df,features): print("calculating nan_info...") df_nan = (df[features].mul(0) + 1).fillna(0) #marke non_null values as 1 and null as zero df_nan['customer_ID'] = df['customer_ID'] nan_sum = df_nan.groupby("customer_ID").sum().sum(axis=1) #total unknown values for a customer nan_last = df_nan.groupby("customer_ID").last().sum(axis=1)#how many last values that are not known del df_nan gc.collect() return nan_sum,nan_last
这里可以不使用平均值,而是使用修正的平均值,如基于时间的加权平均值或 HMA(hull moving average)。
Dalam artikel ini, kami telah membentangkan beberapa strategi ciri buatan tangan yang paling biasa digunakan untuk meramalkan risiko lalai dalam dunia nyata. Tetapi sentiasa ada cara baharu dan inovatif untuk mereka bentuk ciri, dan kaedah menetapkan ciri secara manual memakan masa dan susah payah, jadi kami akan memperkenalkan cara menggunakan alatan untuk penjanaan ciri automatik dalam artikel kemudian.
Atas ialah kandungan terperinci Gunakan ciri buatan tangan untuk meningkatkan prestasi model. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!