日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逻辑回归预测事件发生的概率_通过逻辑回归,对信用卡申请数据使用卡方分箱法预测违约率建模...

發布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逻辑回归预测事件发生的概率_通过逻辑回归,对信用卡申请数据使用卡方分箱法预测违约率建模... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 建模步驟

(1)從數據中衍生特征

(2)對類別型變量和數值型變量進行補缺

(3)基于卡方分箱法對變量進行分箱

(4)WOE編碼后的單變量分析與多變量分析

(5)應用邏輯回歸模型

(6)尺度化

(7)模型預測能力

二、代碼

import pandas as pdimport datetimeimport collectionsimport numpy as npimport numbersimport randomimport sysimport picklefrom itertools import combinationsfrom sklearn.linear_model import LinearRegressionfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_curvefrom sklearn.metrics import roc_auc_scoreimport statsmodels.api as sm# ##針對圖形顯示問題# import matplotlib# matplotlib.use('TkAgg')from importlib import reloadfrom matplotlib import pyplot as plt# 如果Jupyter,需要打開下面行代碼。#%matplotlib inlinereload(sys)# sys.setdefaultencoding( "utf-8")from scorecard_functions import *from sklearn.linear_model import LogisticRegressionCV# -*- coding: utf-8 -*-######################################## UDF: 自定義函數 ########################################### 對時間窗口,計算累計產比 ###def TimeWindowSelection(df, daysCol, time_windows): ''' :param df: the dataset containg variabel of days :param daysCol: the column of days :param time_windows: the list of time window :return: ''' freq_tw = {} for tw in time_windows: freq = sum(df[daysCol].apply(lambda x: int(x<=tw))) freq_tw[tw] = freq # freq_tw = {dict}: {30: 499175, 60: 524173, 90: 535223, 120: 542683, 150: 548083, 180: 552009, 210: 555009, 240: 557393, 270: 559259, 300: 560823, 330: 562458, 360: 563952} return freq_twdef DeivdedByZero(nominator, denominator): ''' 當分母為0時,返回0;否則返回正常值 ''' if denominator == 0: return 0 else: return nominator*1.0/denominator#對某些統一的字段進行統一def ChangeContent(x): y = x.upper() if y == '_MOBILEPHONE': y = '_PHONE' return ydef MissingCategorial(df,x): ''' :param df: the dataresources. :param x: the column of the dataresources. :return: ''' missing_vals = df[x].map(lambda x: int(x!=x)) return sum(missing_vals)*1.0/df.shape[0]def MissingContinuous(df,x): missing_vals = df[x].map(lambda x: int(np.isnan(x))) return sum(missing_vals) * 1.0 / df.shape[0]def MakeupRandom(x, sampledList): if x==x: return x else: randIndex = random.randint(0, len(sampledList)-1) return sampledList[randIndex]#############################################################Step 0: 數據分析的初始工作, 包括讀取數據文件、檢查用戶Id的一致性等############################################################## F:\chen\download\creditcard\Chimerge\cyc# folderOfData = '/Users/Code/Data Collections/bank default/'folderOfData = 'F:\/chen\/download\/creditcard\/Chimerge\/cyc\/'data1 = pd.read_csv(folderOfData+'PPD_LogInfo_3_1_Training_Set.csv', header = 0)data2 = pd.read_csv(folderOfData+'PPD_Training_Master_GBK_3_1_Training_Set.csv', dtype = {'target': np.int64}, header = 0,encoding = 'gbk')data3 = pd.read_csv(folderOfData+'PPD_Userupdate_Info_3_1_Training_Set.csv', header = 0)# score card:# data=pd.read_csv('F:\/chen\/download\/creditcard\/score card\/data_all_values.csv')############################################################################################## Step 1: 從PPD_LogInfo_3_1_Training_Set & PPD_Userupdate_Info_3_1_Training_Set數據中衍生特征############################################################################################### compare whether the four city variables matchdata2['city_match'] = data2.apply(lambda x: int(x.UserInfo_2 == x.UserInfo_4 == x.UserInfo_8 == x.UserInfo_20),axis = 1)# score card:# data=pd.read_csv('F:\/chen\/download\/creditcard\/score card\/data_all_values.csv')del data2['UserInfo_2']del data2['UserInfo_4']del data2['UserInfo_8']del data2['UserInfo_20']### 提取申請日期,計算日期差,查看日期差的分布data1['logInfo'] = data1['LogInfo3'].map(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d'))data1['Listinginfo'] = data1['Listinginfo1'].map(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d'))data1['ListingGap'] = data1[['logInfo','Listinginfo']].apply(lambda x: (x[1]-x[0]).days,axis = 1)plt.hist(data1['ListingGap'],bins=200)plt.title('Days between login date and listing date')ListingGap2 = data1['ListingGap'].map(lambda x: min(x,365))plt.hist(ListingGap2,bins=200)# plt.figure()plt.show()timeWindows = TimeWindowSelection(data1, 'ListingGap', range(30,361,30))'''使用180天作為最大的時間窗口計算新特征所有可以使用的時間窗口可以有7 days, 30 days, 60 days, 90 days, 120 days, 150 days and 180 days.在每個時間窗口內,計算總的登錄次數,不同的登錄方式,以及每種登錄方式的平均次數'''time_window = [7, 30, 60, 90, 120, 150, 180]var_list = ['LogInfo1','LogInfo2']data1GroupbyIdx = pd.DataFrame({'Idx':data1['Idx'].drop_duplicates()})for tw in time_window: data1['TruncatedLogInfo'] = data1['Listinginfo'].map(lambda x: x + datetime.timedelta(-tw)) temp = data1.loc[data1['logInfo'] >= data1['TruncatedLogInfo']] for var in var_list: #count the frequences of LogInfo1 and LogInfo2 count_stats = temp.groupby(['Idx'])[var].count().to_dict() data1GroupbyIdx[str(var)+'_'+str(tw)+'_count'] = data1GroupbyIdx['Idx'].map(lambda x: count_stats.get(x,0)) # count the distinct value of LogInfo1 and LogInfo2 Idx_UserupdateInfo1 = temp[['Idx', var]].drop_duplicates() uniq_stats = Idx_UserupdateInfo1.groupby(['Idx'])[var].count().to_dict() data1GroupbyIdx[str(var) + '_' + str(tw) + '_unique'] = data1GroupbyIdx['Idx'].map(lambda x: uniq_stats.get(x,0)) # calculate the average count of each value in LogInfo1 and LogInfo2 # groupbyid,因為之前Idx已經生成,所以groupby,有可能找不到,這樣就是0。從而在計算平均值時候會出現分母是01的情況,使用DeicdedbyZero會防止這種情況。 data1GroupbyIdx[str(var) + '_' + str(tw) + '_avg_count'] = data1GroupbyIdx[[str(var)+'_'+str(tw)+'_count',str(var) + '_' + str(tw) + '_unique']].\ apply(lambda x: DeivdedByZero(x[0],x[1]), axis=1)data3['ListingInfo'] = data3['ListingInfo1'].map(lambda x: datetime.datetime.strptime(x,'%Y/%m/%d'))data3['UserupdateInfo'] = data3['UserupdateInfo2'].map(lambda x: datetime.datetime.strptime(x,'%Y/%m/%d'))data3['ListingGap'] = data3[['UserupdateInfo','ListingInfo']].apply(lambda x: (x[1]-x[0]).days,axis = 1)collections.Counter(data3['ListingGap'])hist_ListingGap = np.histogram(data3['ListingGap'])hist_ListingGap = pd.DataFrame({'Freq':hist_ListingGap[0],'gap':hist_ListingGap[1][1:]})hist_ListingGap['CumFreq'] = hist_ListingGap['Freq'].cumsum()hist_ListingGap['CumPercent'] = hist_ListingGap['CumFreq'].map(lambda x: x*1.0/hist_ListingGap.iloc[-1]['CumFreq'])'''對不同表達方法,如: QQ和qQ, Idnumber和idNumber,MOBILEPHONE和PHONE等 進行統一在時間切片內,計算 (1) 更新的頻率 (2) 每種更新對象的種類個數 (3) 對重要信息如IDNUMBER,HASBUYCAR, MARRIAGESTATUSID, PHONE的更新。這一點,比如,申請人對自己的重要信息如身份證、是否有車、婚姻狀況等等進行更改。表示這個人很有可能存在問題,會衍生出一個變量。 不過這里的程序,有bug。就是它會統計data3里面有多少個 IDNUMBER等等,然后map去對應的ID,但是,如果get不到的話,它會有默認值就是ID自己。所以有時候看到這個值很大,因為就是ID它自己。代碼:data3GroupbyIdx['UserupdateInfo_' + str(tw) + str(item)] = data3GroupbyIdx['Idx'].map(lambda x: item_dict.get(x, x))'''data3['UserupdateInfo1'] = data3['UserupdateInfo1'].map(ChangeContent)data3GroupbyIdx = pd.DataFrame({'Idx':data3['Idx'].drop_duplicates()})time_window = [7, 30, 60, 90, 120, 150, 180]for tw in time_window: data3['TruncatedLogInfo'] = data3['ListingInfo'].map(lambda x: x + datetime.timedelta(-tw)) temp = data3.loc[data3['UserupdateInfo'] >= data3['TruncatedLogInfo']] #frequency of updating freq_stats = temp.groupby(['Idx'])['UserupdateInfo1'].count().to_dict() data3GroupbyIdx['UserupdateInfo_'+str(tw)+'_freq'] = data3GroupbyIdx['Idx'].map(lambda x: freq_stats.get(x,0)) # number of updated types Idx_UserupdateInfo1 = temp[['Idx','UserupdateInfo1']].drop_duplicates() uniq_stats = Idx_UserupdateInfo1.groupby(['Idx'])['UserupdateInfo1'].count().to_dict() data3GroupbyIdx['UserupdateInfo_' + str(tw) + '_unique'] = data3GroupbyIdx['Idx'].map(lambda x: uniq_stats.get(x, x)) #average count of each type data3GroupbyIdx['UserupdateInfo_' + str(tw) + '_avg_count'] = data3GroupbyIdx[['UserupdateInfo_'+str(tw)+'_freq', 'UserupdateInfo_' + str(tw) + '_unique']]. \ apply(lambda x: x[0] * 1.0 / x[1], axis=1) #whether the applicant changed items like IDNUMBER,HASBUYCAR, MARRIAGESTATUSID, PHONE # Idx_UserupdateInfo1 = {DataFrame} # Idx UserupdateInfo1 # 23 10002 [_PHONE] # 42 10006 [_EDUCATIONID] # 43 10006 [_HASBUYCAR] # 44 10006 [_MARRIAGESTATUSID] # 45 10006 [_PHONE] # ... ... ... # 372437 9995 [_QQ] # 372438 9995 [_RESIDENCEADDRESS] # 372439 9995 [_RESIDENCEPHONE] # 372440 9995 [_RESIDENCETYPEID] # 372441 9995 [_RESIDENCEYEARS] Idx_UserupdateInfo1['UserupdateInfo1'] = Idx_UserupdateInfo1['UserupdateInfo1'].map(lambda x: [x]) # Idx_UserupdateInfo1_V2 = {Series}Idx # 8 [_PHONE] # 16 [_PHONE] # 17 [_PHONE] # 18 [_EDUCATIONID, _HASBUYCAR, _IDNUMBER, _LASTUPD... # 20 [_EDUCATIONID, _HASBUYCAR, _IDNUMBER, _LASTUPD... # ... # 91688 [_CITYID, _DISTRICTID, _EDUCATIONID, _HASBUYCA... # 91689 [_CITYID, _DISTRICTID, _EDUCATIONID, _HASBUYCA... # 91695 [_DISTRICTID, _LASTUPDATEDATE, _PHONE, _RESIDE... # 91702 [_CITYID, _DISTRICTID, _EDUCATIONID, _HASBUYCA... # 91703 [_LASTUPDATEDATE] Idx_UserupdateInfo1_V2 = Idx_UserupdateInfo1.groupby(['Idx'])['UserupdateInfo1'].sum() for item in ['_IDNUMBER','_HASBUYCAR','_MARRIAGESTATUSID','_PHONE']: item_dict = Idx_UserupdateInfo1_V2.map(lambda x: int(item in x)).to_dict() data3GroupbyIdx['UserupdateInfo_' + str(tw) + str(item)] = data3GroupbyIdx['Idx'].map(lambda x: item_dict.get(x, x))# Combine the above features with raw features in PPD_Training_Master_GBK_3_1_Training_SetallData = pd.concat([data2.set_index('Idx'), data3GroupbyIdx.set_index('Idx'), data1GroupbyIdx.set_index('Idx')],axis= 1)allData.to_csv(folderOfData+'allData_0.csv',encoding = 'gbk')######################################## Step 2: 對類別型變量和數值型變量進行補缺#######################################allData = pd.read_csv(folderOfData+'allData_0.csv',header = 0,encoding = 'gbk')allFeatures = list(allData.columns)allFeatures.remove('target')if 'Idx' in allFeatures: allFeatures.remove('Idx')allFeatures.remove('ListingInfo')#檢查是否有常數型變量(如果有的話就拿掉),并且檢查是類別型還是數值型變量"""有的時候,一些雖然是數值型變量,但是取值很少。這個時候可能這些是表示特殊意義的類別型"""numerical_var = []for col in allFeatures: if len(set(allData[col])) == 1: print('delete {} from the dataset because it is a constant'.format(col)) del allData[col] allFeatures.remove(col) else: # 排除了缺失值 uniq_valid_vals = [i for i in allData[col] if i == i] # 通過set()方法,很好地拿到了各個值 uniq_valid_vals = list(set(uniq_valid_vals)) if len(uniq_valid_vals) >= 10 and isinstance(uniq_valid_vals[0], numbers.Real): numerical_var.append(col)categorical_var = [i for i in allFeatures if i not in numerical_var]#檢查變量的最多值的占比情況,以及每個變量中占比最大的值records_count = allData.shape[0]# col_most_values{'學歷': 0.86,'收入':0.45, '單位性質':0.58,'UserInfo_19': 0.909}# col_large_value存放每一個變量col最大值對應的值 = {'UserInfo_19': '廣東省', '收入':23021}col_most_values,col_large_value = {},{}for col in allFeatures: # UserInfo_19 target # 廣東省 30001 # 廣西 2000 # ''' value_count = {Series} 山西省 945 廣東省 2405 廣西壯族自治區 1198 新疆維吾爾自治區 204 Name: UserInfo_19, dtype: int64 ''' value_count = allData[col].groupby(allData[col]).count() col_most_values[col] = max(value_count)/records_count # 這里要注意, index索引出來的不一定是數字,而是groupby出來的各種值。如果是'學歷'這個變量的話,就是:本科、研究生、博士等等 # groupby什么,什么就是index # 所以這個large_value起名字也很好,就是large_value的值。而不是index. # print("value_count[value_count== max(value_count)].index = ") # print(value_count[value_count== max(value_count)].index) large_value = value_count[value_count== max(value_count)].index[0] # value_count[value_count == max(value_count)] 這個公式,只會起過濾作用,選擇條件是True的數據出來。也即:只有1行數據出來 # 測試了一下: 原來,index的值是:Float64Index([5.0], dtype='float64', name='UserInfo_3'),所以,必須寫成index[0],這樣index[0] = 5.0 # large_value = value_count[value_count == max(value_count)].index col_large_value[col] = large_valuecol_most_values_df = pd.DataFrame.from_dict(col_most_values, orient = 'index')col_most_values_df.columns = ['max percent']col_most_values_df = col_most_values_df.sort_values(by = 'max percent', ascending = False)pcnt = list(col_most_values_df[:500]['max percent'])vars = list(col_most_values_df[:500].index)plt.bar(range(len(pcnt)), height = pcnt)plt.title('Largest Percentage of Single Value in Each Variable')plt.show()# max percent# WeblogInfo_13 0.999700# SocialNetwork_11 0.999600說# WeblogInfo_55 0.999433#計算多數值占比超過90%的字段中,少數值的壞樣本率是否會顯著高于多數值# print("col_most_values_df[col_most_values_df['max percent']>=0.9].index = ")# print(col_most_values_df[col_most_values_df['max percent']>=0.9].index)large_percent_cols = list(col_most_values_df[col_most_values_df['max percent']>=0.9].index)bad_rate_diff = {}# print("col_large_value = ")# print(col_large_value)# print("large_percent_cols = ")# print(large_percent_cols)for col in large_percent_cols: large_value = col_large_value[col] temp = allData[[col,'target']] temp[col] = temp.apply(lambda x: int(x[col]==large_value),axis=1) bad_rate = temp.groupby(col).mean() # print("bad_rate = ") # print(bad_rate) if bad_rate.iloc[0]['target'] == 0: bad_rate_diff[col] = 0 continue bad_rate_diff[col] = np.log(bad_rate.iloc[0]['target']/bad_rate.iloc[1]['target'])bad_rate_diff_sorted = sorted(bad_rate_diff.items(),key=lambda x: x[1], reverse=True)bad_rate_diff_sorted_values = [x[1] for x in bad_rate_diff_sorted]plt.bar(x = range(len(bad_rate_diff_sorted_values)), height = bad_rate_diff_sorted_values)plt.title("log of bad rate ratio in large varaibles in which 90% is single value")plt.show()#由于所有的少數值的壞樣本率并沒有顯著高于多數值,意味著這些變量可以直接剔除for col in large_percent_cols: if col in numerical_var: numerical_var.remove(col) else: categorical_var.remove(col) del allData[col]'''對類別型變量,如果缺失超過80%, 就刪除,否則當成特殊的狀態'''missing_pcnt_threshould_1 = 0.8for col in categorical_var: missingRate = MissingCategorial(allData,col) print('{0} has missing rate as {1}'.format(col,missingRate)) if missingRate > missing_pcnt_threshould_1: categorical_var.remove(col) del allData[col] if 0 < missingRate < missing_pcnt_threshould_1: uniq_valid_vals = [i for i in allData[col] if i == i] uniq_valid_vals = list(set(uniq_valid_vals)) if isinstance(uniq_valid_vals[0], numbers.Real): missing_position = allData.loc[allData[col] != allData[col]][col].index not_missing_sample = [-1]*len(missing_position) allData.loc[missing_position, col] = not_missing_sample else: # In this way we convert NaN to NAN, which is a string instead of np.nan allData[col] = allData[col].map(lambda x: str(x).upper())allData_bk = allData.copy()'''檢查數值型變量'''missing_pcnt_threshould_2 = 0.8deleted_var = []for col in numerical_var: missingRate = MissingContinuous(allData, col) print('{0} has missing rate as {1}'.format(col, missingRate)) if missingRate > missing_pcnt_threshould_2: deleted_var.append(col) print('we delete variable {} because of its high missing rate'.format(col)) else: if missingRate > 0: not_missing = allData.loc[allData[col] == allData[col]][col] #makeuped = allData[col].map(lambda x: MakeupRandom(x, list(not_missing))) # missing_positon 是一個index的list missing_position = allData.loc[allData[col] != allData[col]][col].index # 函數random.sample(list, n)作用是隨機從list中取出n個元素 not_missing_sample = random.sample(list(not_missing), len(missing_position)) allData.loc[missing_position,col] = not_missing_sample #del allData[col] #allData[col] = makeuped missingRate2 = MissingContinuous(allData, col) print('missing rate after making up is:{}'.format(str(missingRate2)))if deleted_var != []: for col in deleted_var: numerical_var.remove(col) del allData[col]allData.to_csv(folderOfData+'allData_1.csv', header=True,encoding='gbk', columns = allData.columns, index=False)allData = pd.read_csv(folderOfData+'allData_1.csv', header=0,encoding='gbk')#################################### Step 3: 基于卡方分箱法對變量進行分箱#####################################for each categorical variable, if it has distinct values more than 5, we use the ChiMerge to merge ittrainData = pd.read_csv(folderOfData+'allData_1.csv',header = 0, encoding='gbk',dtype = {'target': np.int64})allFeatures = list(trainData.columns)allFeatures.remove('ListingInfo')allFeatures.remove('target')#allFeatures.remove('Idx')print("開始基于卡方分箱法對變量進行分箱")# 將特征區分為數值型和類別型numerical_var = []for var in allFeatures: uniq_vals = list(set(trainData[var])) if np.nan in uniq_vals: uniq_vals.remove( np.nan) if len(uniq_vals) >= 10 and isinstance(uniq_vals[0], numbers.Real): numerical_var.append(var)categorical_var = [i for i in allFeatures if i not in numerical_var]for col in categorical_var: #for Chinese character, upper() is not valid if col not in ['UserInfo_7','UserInfo_9','UserInfo_19']: trainData[col] = trainData[col].map(lambda x: str(x).upper())'''對于類別型變量,按照以下方式處理1,如果變量的取值個數超過5,計算bad rate進行編碼2,除此之外,其他任何類別型變量如果有某個取值中,對應的樣本全部是壞樣本或者是好樣本,進行合并。'''deleted_features = [] #將處理過的變量刪除,防止對后面建模的干擾encoded_features = {} #將bad rate編碼方式保存下來,在以后的測試和生產環境中需要使用merged_features = {} #將類別型變量合并方案保留下來var_IV = {} #save the IV values for binned features #將IV值和WOE值保留var_WOE = {}for col in categorical_var: print("現在正在處理 類別型變量。。處理的變量是:") print('we are processing {}'.format(col)) if len(set(trainData[col]))>5: print(" now the len this category is > 5 , 需要用bad rate做編碼轉換成數值型變量,再分箱") print('{} is encoded with bad rate'.format(col)) col0 = str(col)+'_encoding' #(1), 計算壞樣本率并進行編碼 encoding_result = BadRateEncoding(trainData, col, 'target') # 0 0.082894 # 1 0.058025 # 2 0.082624 # 3 0.058025 # 4 0.058025 # ... # 29995 0.077460 # 29996 0.082041 # 29997 0.082624 # 29998 0.058025 # 29999 0.082041 # Name: UserInfo_1, Length: 30000, dtype: float64, # 'bad_rate': {'-1.0': 0.0, '0.0': 0.0, '1.0': 0.058024568061520024, '2.0': 0.018867924528301886, '3.0': 0.08262393590385578, '4.0': 0.0774604479145264, '5.0': 0.0828936170212766, '6.0': 0.08204081632653061, '7.0': 0.07959479015918958}} trainData[col0], br_encoding = encoding_result['encoding'],encoding_result['bad_rate'] #(2), 將(1)中的編碼后的變量也加入數值型變量列表中,為后面的卡方分箱做準備 numerical_var.append(col0) #(3), 保存編碼結果,保持編碼方案用于測試處理 encoded_features[col] = [col0, br_encoding] # print("encoded_features = ") # print(encoded_features) #(4), 刪除原始值 deleted_features.append(col) else: print("類別型變量處理中。本變量 類別數少于或等于5") bad_bin = trainData.groupby([col])['target'].sum() #對于類別數少于5個,但是出現0壞樣本的特征需要做處理 if min(bad_bin) == 0: print("說明出現了 0 壞樣本的特征,需要處理") print('{} has 0 bad sample!'.format(col)) col1 = str(col) + '_mergeByBadRate' #(1), 找出最優合并方式,使得每一箱同時包含好壞樣本 mergeBin = MergeBad0(trainData, col, 'target') # (2), 依照(1)的結果對值進行合并 trainData[col1] = trainData[col].map(mergeBin) maxPcnt = MaximumBinPcnt(trainData, col1) #如果合并后導致有箱占比超過90%,就刪除。 if maxPcnt > 0.9: print("說明合并后導致有箱占比超過90%,需要刪除。為什么能夠直接刪除?不允許計算10%的顯著性?") print('{} is deleted because of large percentage of single bin'.format(col)) deleted_features.append(col) categorical_var.remove(col) del trainData[col] continue #(3) 如果合并后的新的變量滿足要求,就保留下來 print("說明合并后導致有箱占比 沒有 超過90%,不需要刪除。正常操作即可") merged_features[col] = [col1, mergeBin] WOE_IV = CalcWOE(trainData, col1, 'target') var_WOE[col1] = WOE_IV['WOE'] var_IV[col1] = WOE_IV['IV'] #del trainData[col] deleted_features.append(col) else: print("說明沒有 0 壞樣本的特征,按照最正常處理方式即可") WOE_IV = CalcWOE(trainData, col, 'target') var_WOE[col] = WOE_IV['WOE'] var_IV[col] = WOE_IV['IV']print("處理 類別型變量工作結束! 開始處理數值型變量")var_cutoff = {}for col in numerical_var: """ 這是最重要的環節 """ print("正在處理數值型變量,變量是:") print("{} is in processing".format(col)) col1 = str(col) + '_Bin' #(1),用卡方分箱法進行分箱,并且保存每一個分割的端點。例如端點=[10,20,30]表示將變量分為x<10,1030. #特別地,缺失值-1不參與分箱 ''' 缺失值采用-1表示。如果有缺失值,則不參與分箱 cutOffPoints是分割點 ''' if -1 in set(trainData[col]): special_attribute = [-1] else: special_attribute = [] cutOffPoints = ChiMerge(trainData, col, 'target',special_attribute=special_attribute) var_cutoff[col] = cutOffPoints trainData[col1] = trainData[col].map(lambda x: AssignBin(x, cutOffPoints,special_attribute=special_attribute)) #(2), check whether the bad rate is monotone BRM = BadRateMonotone(trainData, col1, 'target',special_attribute=special_attribute) if not BRM: if special_attribute == []: bin_merged = Monotone_Merge(trainData, 'target', col1) removed_index = [] for bin in bin_merged: if len(bin)>1: indices = [int(b.replace('Bin ','')) for b in bin] removed_index = removed_index+indices[0:-1] # removed_index = {list}[0] # cutOffPoints = {list}: [10750.0, 26020.0, 49531.0, 79315.0] # removed_point = {list}: [10750.0, 79315.0] removed_point = [cutOffPoints[k] for k in removed_index] for p in removed_point: cutOffPoints.remove(p) var_cutoff[col] = cutOffPoints trainData[col1] = trainData[col].map(lambda x: AssignBin(x, cutOffPoints, special_attribute=special_attribute)) else: cutOffPoints2 = [i for i in cutOffPoints if i not in special_attribute] temp = trainData.loc[~trainData[col].isin(special_attribute)] bin_merged = Monotone_Merge(temp, 'target', col1) removed_index = [] for bin in bin_merged: if len(bin) > 1: indices = [int(b.replace('Bin ', '')) for b in bin] # first # removed_index = removed_index + indices[0:-1] removed_point = [cutOffPoints2[k] for k in removed_index] for p in removed_point: cutOffPoints2.remove(p) cutOffPoints2 = cutOffPoints2 + special_attribute var_cutoff[col] = cutOffPoints2 trainData[col1] = trainData[col].map(lambda x: AssignBin(x, cutOffPoints2, special_attribute=special_attribute)) maxPcnt = MaximumBinPcnt(trainData, col1) if maxPcnt > 0.9: # del trainData[col1] deleted_features.append(col) numerical_var.remove(col) print('we delete {} because the maximum bin occupies more than 90%'.format(col)) continue WOE_IV = CalcWOE(trainData, col1, 'target') var_IV[col] = WOE_IV['IV'] var_WOE[col] = WOE_IV['WOE'] #del trainData[col]print("數值型變量工作結束")print("Step3 基于卡方分箱法對變量進行分箱, 工作完成后的結果")print("var_WOE = ")print(var_WOE)print("var_IV = ")print(var_IV)print("merged_features = ")print(merged_features)trainData.to_csv(folderOfData+'allData_2.csv', header=True,encoding='gbk', columns = trainData.columns, index=False)print("var_cutoff = ")print(var_cutoff)with open(folderOfData+'var_WOE.pkl',"wb") as f: f.write(pickle.dumps(var_WOE))with open(folderOfData+'var_IV.pkl',"wb") as f: f.write(pickle.dumps(var_IV))with open(folderOfData+'var_cutoff.pkl',"wb") as f: f.write(pickle.dumps(var_cutoff))with open(folderOfData+'merged_features.pkl',"wb") as f: f.write(pickle.dumps(merged_features))######################################### Step 4: WOE編碼后的單變量分析與多變量分析#########################################trainData = pd.read_csv(folderOfData+'allData_2.csv', header=0, encoding='gbk')with open(folderOfData+'var_WOE.pkl',"rb") as f: var_WOE = pickle.load(f)with open(folderOfData+'var_IV.pkl',"rb") as f: var_IV = pickle.load(f)with open(folderOfData+'var_cutoff.pkl',"rb") as f: var_cutoff = pickle.load(f)with open(folderOfData+'merged_features.pkl',"rb") as f: merged_features = pickle.load(f)#將一些看起來像數值變量實際上是類別變量的字段轉換成字符num2str = ['SocialNetwork_13','SocialNetwork_12','UserInfo_6','UserInfo_5','UserInfo_10','UserInfo_11','UserInfo_12','UserInfo_13','UserInfo_17']for col in num2str: trainData[col] = trainData[col].map(lambda x: str(x))for col in var_WOE.keys(): print(col) col2 = str(col)+"_WOE" if col in var_cutoff.keys(): cutOffPoints = var_cutoff[col] special_attribute = [] if - 1 in cutOffPoints: special_attribute = [-1] # 需要有給樣本賦值bin的過程。因為數值型變量已經安裝ChiMerge值進行了分箱。 binValue = trainData[col].map(lambda x: AssignBin(x, cutOffPoints,special_attribute=special_attribute)) trainData[col2] = binValue.map(lambda x: var_WOE[col][x]) else: trainData[col2] = trainData[col].map(lambda x: var_WOE[col][x])trainData.to_csv(folderOfData+'allData_3.csv', header=True,encoding='gbk', columns = trainData.columns, index=False)### (i) 選擇IV高于閾值的變量trainData = pd.read_csv(folderOfData+'allData_3.csv', header=0,encoding='gbk')all_IV = list(var_IV.values())all_IV = sorted(all_IV, reverse=True)plt.bar(x=range(len(all_IV)), height = all_IV)plt.title("IV sorted")plt.show()iv_threshould = 0.02varByIV = [k for k, v in var_IV.items() if v > iv_threshould]### (ii) 檢查WOE編碼后的變量的兩兩線性相關性var_IV_selected = {k:var_IV[k] for k in varByIV}var_IV_sorted = sorted(var_IV_selected.items(), key=lambda d:d[1], reverse = True)var_IV_sorted = [i[0] for i in var_IV_sorted]removed_var = []roh_thresould = 0.6for i in range(len(var_IV_sorted)-1): if var_IV_sorted[i] not in removed_var: x1 = var_IV_sorted[i]+"_WOE" for j in range(i+1,len(var_IV_sorted)): if var_IV_sorted[j] not in removed_var: x2 = var_IV_sorted[j] + "_WOE" roh = np.corrcoef([trainData[x1], trainData[x2]])[0, 1] if abs(roh) >= roh_thresould: print('the correlation coeffient between {0} and {1} is {2}'.format(x1, x2, str(roh))) if var_IV[var_IV_sorted[i]] > var_IV[var_IV_sorted[j]]: removed_var.append(var_IV_sorted[j]) else: removed_var.append(var_IV_sorted[i])var_IV_sortet_2 = [i for i in var_IV_sorted if i not in removed_var]### (iii)檢查是否有變量與其他所有變量的VIF > 10# 由于涉及到Matrix,所以需要把DataFrame轉為Matrixfor i in range(len(var_IV_sortet_2)): x0 = trainData[var_IV_sortet_2[i]+'_WOE'] x0 = np.array(x0) # 之前,var_IV_sorted_2 = {list} : ['ThirdParty_Info_Period2_6', 'ThirdParty_Info_Period6_6', 'ThirdParty_Info_Period5_6', 'UserInfo_14_encoding', 'ThirdParty_Info_Period4_15', 'ThirdParty_Info_Period1_15', 'ThirdParty_Info_Period3_15', 'ThirdParty_Info_Period6_1', 'ThirdParty_Info_Period5_1', 'ThirdParty_Info_Period5_2', 'UserInfo_16_encoding', 'ThirdParty_Info_Period5_10', 'WeblogInfo_6', 'Idx', 'ThirdParty_Info_Period4_8', 'ThirdParty_Info_Period2_8', 'UserInfo_7_encoding', 'WeblogInfo_20_encoding', 'ThirdParty_Info_Period3_10', 'ThirdParty_Info_Period4_9', 'UserInfo_17', 'ThirdParty_Info_Period1_10', 'ThirdParty_Info_Period1_3', 'ThirdParty_Info_Period2_10', 'ThirdParty_Info_Period4_4', 'WeblogInfo_2_encoding', 'ThirdParty_Info_Period3_3', 'UserInfo_1_encoding', 'LogInfo1_30_avg_count', 'WeblogInfo_5', 'UserInfo_12'] # 之后,X_Col = {list} : ['ThirdParty_Info_Period6_6_WOE', 'ThirdParty_Info_Period5_6_WOE', 'UserInfo_14_encoding_WOE', 'ThirdParty_Info_Period4_15_WOE', 'ThirdParty_Info_Period1_15_WOE', 'ThirdParty_Info_Period3_15_WOE', 'ThirdParty_Info_Period6_1_WOE', 'ThirdParty_Info_Period5_1_WOE', 'ThirdParty_Info_Period5_2_WOE', 'UserInfo_16_encoding_WOE', 'ThirdParty_Info_Period5_10_WOE', 'WeblogInfo_6_WOE', 'Idx_WOE', 'ThirdParty_Info_Period4_8_WOE', 'ThirdParty_Info_Period2_8_WOE', 'UserInfo_7_encoding_WOE', 'WeblogInfo_20_encoding_WOE', 'ThirdParty_Info_Period3_10_WOE', 'ThirdParty_Info_Period4_9_WOE', 'UserInfo_17_WOE', 'ThirdParty_Info_Period1_10_WOE', 'ThirdParty_Info_Period1_3_WOE', 'ThirdParty_Info_Period2_10_WOE', 'ThirdParty_Info_Period4_4_WOE', 'WeblogInfo_2_encoding_WOE', 'ThirdParty_Info_Period3_3_WOE', 'UserInfo_1_encoding_WOE', 'LogInfo1_30_avg_count_WOE', 'WeblogInfo_5_WOE', 'UserInfo_12_WOE'] X_Col = [k+'_WOE' for k in var_IV_sortet_2 if k != var_IV_sortet_2[i]] X = trainData[X_Col] X = np.matrix(X) regr = LinearRegression() clr= regr.fit(X, x0) x_pred = clr.predict(X) R2 = 1 - ((x_pred - x0) ** 2).sum() / ((x0 - x0.mean()) ** 2).sum() vif = 1/(1-R2) if vif > 10: print("Warning: the vif for {0} is {1}".format(var_IV_sortet_2[i], vif))########################## Step 5: 應用邏輯回歸模型########################### 這里 var_IV_sortet_2是變量名稱multi_analysis = [i+'_WOE' for i in var_IV_sortet_2]y = trainData['target']X = trainData[multi_analysis].copy()X['intercept'] = [1]*X.shape[0]LR = sm.Logit(y, X).fit()summary = LR.summary2()pvals = LR.pvalues.to_dict()params = LR.params.to_dict()#發現有變量不顯著,因此需要單獨檢驗顯著性'''把該變量單獨擰出來,看是否顯著'''varLargeP = {k: v for k,v in pvals.items() if v >= 0.1}varLargeP = sorted(varLargeP.items(), key=lambda d:d[1], reverse = True)varLargeP = [i[0] for i in varLargeP]p_value_list = {}for var in varLargeP: # trainData[var] = {Series} X_temp = trainData[var].copy().to_frame() X_temp['intercept'] = [1] * X_temp.shape[0] LR = sm.Logit(y, X_temp).fit() p_value_list[var] = LR.pvalues[var]for k,v in p_value_list.items(): print("{0} has p-value of {1} in univariate regression".format(k,v))#發現有變量的系數為正,因此需要單獨檢驗正確性varPositive = [k for k,v in params.items() if v >= 0]coef_list = {}for var in varPositive: X_temp = trainData[var].copy().to_frame() X_temp['intercept'] = [1] * X_temp.shape[0] LR = sm.Logit(y, X_temp).fit() coef_list[var] = LR.params[var]for k,v in coef_list.items(): print("{0} has coefficient of {1} in univariate regression".format(k,v))selected_var = [multi_analysis[0]]for var in multi_analysis[1:]: try_vars = selected_var+[var] X_temp = trainData[try_vars].copy() X_temp['intercept'] = [1] * X_temp.shape[0] LR = sm.Logit(y, X_temp).fit() #summary = LR.summary2() pvals, params = LR.pvalues, LR.params del params['intercept'] if max(pvals)<0.1 and max(params)<0: selected_var.append(var)# X_temp = {DataFrame} ThirdParty_Info_Period2_6_WOE ... intercept# 0 0.357555 ... 1# 1 -0.413268 ... 1# 2 -0.413268 ... 1# 3 0.357555 ... 1# 4 0.357555 ... 1# ... ... ... ...# 29995 -0.056315 ... 1# 29996 -0.056315 ... 1# 29997 0.357555 ... 1# 29998 0.357555 ... 1# 29999 0.357555 ... 1## [30000 rows x 19 columns]# y = {Series} 0 0# 1 0# 2 0# 3 0# 4 0# ..# 29995 0# 29996 0# 29997 0# 29998 0# 29999 0# Name: target, Length: 30000, dtype: int64# try_vars = {list} : ['ThirdParty_Info_Period2_6_WOE', 'ThirdParty_Info_Period6_6_WOE', 'ThirdParty_Info_Period5_6_WOE', 'UserInfo_14_encoding_WOE', 'ThirdParty_Info_Period1_15_WOE', 'ThirdParty_Info_Period3_15_WOE', 'ThirdParty_Info_Period6_1_WOE', 'UserInfo_16_encoding_WOE', 'WeblogInfo_4_WOE', 'ThirdParty_Info_Period2_8_WOE', 'UserInfo_7_encoding_WOE', 'WeblogInfo_20_encoding_WOE', 'UserInfo_17_WOE', 'ThirdParty_Info_Period1_10_WOE', 'ThirdParty_Info_Period2_10_WOE', 'WeblogInfo_2_encoding_WOE', 'LogInfo1_30_avg_count_WOE', 'UserInfo_12_WOE']# try_vars._len_ = {int} 18LR.summary2()print(LR.summary2())y_pred = LR.predict(X_temp)y_result = pd.DataFrame({'y_pred':y_pred, 'y_real':list(trainData['target'])})roc_auc_score_result = roc_auc_score(trainData['target'], y_pred)print("roc_auc_score_result = ", roc_auc_score_result)################# Step 6: 尺度化#################plt.show()scores = Prob2Score(y_pred, 200, 100)# scores.to_excel("scores.xlsx")plt.title("Score Distribution")plt.xlabel("Score")plt.ylabel("Quantity")plt.hist(scores,bins=100)# plt.title("score-transfer")plt.show()print("完成分數轉換! ")print("Step 6 結束!")######################## Step 7: 生成ROC圖#######################print("開始 step 7")import warningswarnings.filterwarnings('ignore')def proba_conversion(x, threshold3 = 0.3): if (x >= threshold3 ): return 1 else: return 0scores = Prob2Score(y_pred, 200, 100)trainData['predication'] = scoresscorecard = pd.DataFrame({'y_pred':y_pred, 'y_real':list(trainData['target']),'score':scores})ks_result = KS(scorecard,'score','y_real')print("ks_result = ", ks_result)# ROC_AUC(df, score, target)roc_auc_score_result2 = ROC_AUC(trainData, 'predication', 'target')# roc_auc_score_result2 = ROC_AUC(trainData, 'y_pred', 'target', )# 也可用sklearn帶的函數roc_auc_score_result_directly = roc_auc_score(trainData['target'], y_pred)# print("")print("roc_auc_score = ", roc_auc_score_result_directly)#roc_auc_score_result = roc_auc_score(trainData['target'], y_pred)from sklearn.metrics import confusion_matrix, precision_recall_curveimport itertoolsplt.rcParams['font.sans-serif'] = ['SimHei']def plot_precision_recall(): plt.step(recall, precision, color = 'b', alpha = 0.2, where = 'post') plt.fill_between(recall, precision, step = 'post', alpha = 0.2, color = 'b') plt.plot(recall, precision, linewidth=2) plt.xlim([0.0,1]) plt.ylim([0.0,1.05]) plt.xlabel('召回率') plt.ylabel('精確率') plt.title('精確率 - 召回率 曲線') plt.show()def show_metrics(): tp = cm[1,1] fn = cm[1,0] fp = cm[0,1] tn = cm[0,0] print('精確率:{:.3f}'.format(tp/(tp+fp))) print('召回率:{:.3f}'.format(tp/(tp+fn))) print('F1 值:{:.3f}'.format( 2*( ( (tp/(tp+fp))*(tp/(tp+fn)) )/( (tp/(tp+fp))+(tp/(tp+fn)) ) ) ))def plot_confusion_matrix(cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues): plt.figure() plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=0) plt.yticks(tick_marks, classes) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, cm[i, j], horizontalalignment='center', color='white' if cm[i, j] > thresh else 'black') plt.tight_layout() plt.ylabel('True label') plt.xlabel('Predicted label') plt.show()print("結束")

三、運行結果

下面圖片,是代碼在Jupyter Note 上運行后展示的結果

四、具體運行過程

? ? ? 具體運行過程,可以在碼云(https://gitee.com/)上關注用戶號:abcgz

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的逻辑回归预测事件发生的概率_通过逻辑回归,对信用卡申请数据使用卡方分箱法预测违约率建模...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久热免费在线观看 | 国产xvideos免费视频播放 | 亚洲精品一区二区三区新线路 | 国产福利av在线 | 日本深夜福利视频 | 色吊丝在线永久观看最新版本 | 成年人视频在线免费播放 | 日韩最新中文字幕 | 99中文字幕在线观看 | 91视频国产免费 | 麻豆国产精品va在线观看不卡 | 亚洲精品国精品久久99热一 | 中文字幕免费观看视频 | 2020天天干夜夜爽 | 欧美乱大交 | 免费看片网页 | 丁香久久五月 | 三级黄色免费片 | 中文在线中文a | 97电影网站 | 日韩精品在线视频免费观看 | 黄色网免费 | 亚洲香蕉视频 | 成人在线视频观看 | 国产香蕉久久 | 中文字幕成人在线观看 | 亚欧日韩成人h片 | 久久a免费视频 | 国产视频一区在线 | 中文字幕色在线 | 91九色在线视频 | 国产精品视屏 | 国产一级一片免费播放放 | 久草爱视频| 国产在线高清视频 | 中文字幕精品一区二区精品 | 成人四虎影院 | 丁香视频全集免费观看 | 在线观看亚洲a | 成人国产精品久久久久久亚洲 | 99精品国产免费久久久久久下载 | 麻豆91小视频 | 久久婷亚洲五月一区天天躁 | 天天狠狠 | 黄色一级动作片 | 亚洲少妇自拍 | 福利一区视频 | 国产在线无 | 99色网站 | 夜夜夜夜爽| 国产色综合天天综合网 | 麻豆久久久 | a级国产乱理伦片在线观看 亚洲3级 | 国产色资源 | 黄色a在线 | 婷婷激情在线 | 精品久久网 | 久久99国产精品二区护士 | 国产99久久精品一区二区永久免费 | 成人午夜免费福利 | 在线观看视频精品 | 欧美日韩久 | 国产精品99久久免费黑人 | 亚洲欧美日韩在线一区二区 | 天天干亚洲 | 在线看片成人 | 欧美性色综合网站 | 天天色天天色 | 日韩久久电影 | 免费亚洲黄色 | 天天操天天添天天吹 | 国产麻豆视频在线观看 | 超碰国产在线播放 | 91精品视频免费在线观看 | 在线精品一区二区 | 国产精品久久婷婷六月丁香 | 成人av中文字幕 | 88av网站 | 欧美日韩国产精品一区二区亚洲 | 免费色网 | 国产精品福利在线观看 | 日韩av在线免费看 | www.天天色.com| 国产中文字幕91 | 91亚色在线观看 | 欧美一级大片在线观看 | 免费久久99精品国产 | 久久伊99综合婷婷久久伊 | 婷婷久久综合九色综合 | 天天天干| 四虎影视精品成人 | av中文字幕网站 | 2019中文字幕第一页 | www.久草视频 | 99精品在线看 | 午夜精品久久久久久久久久久久久久 | 99精品在线视频播放 | 99久久精品国产网站 | 国产精品黑丝在线观看 | 日本久久综合视频 | 亚洲电影久久 | www亚洲一区 | 成年人黄色在线观看 | 91亚洲精品久久久蜜桃借种 | av资源中文字幕 | 国产成人一区二区精品非洲 | 中文字幕在线免费看 | 国产精品久久一区二区无卡 | 91精品国产99久久久久久红楼 | 久久久久久久久网站 | 国产玖玖在线 | 久久爱992xxoo | 日韩欧美在线综合网 | 中文字幕有码在线观看 | 黄色一级动作片 | 亚洲区色 | 最新国产精品久久精品 | 国产一区欧美日韩 | 国产午夜精品一区二区三区在线观看 | 日批网站在线观看 | 国产剧情在线一区 | 国产精品久久久久亚洲影视 | 日韩一区二区三区观看 | 久久国产色| 中文永久字幕 | 亚洲电影久久久 | 在线观看韩日电影免费 | 亚洲综合在线观看视频 | 国产麻豆精品免费视频 | 四虎影视国产精品免费久久 | 国产中文字幕大全 | 91香蕉视频黄色 | 国产99在线播放 | 国外成人在线视频网站 | 久久久穴 | 久久国产美女 | 久热超碰| 日韩免费三区 | av国产在线观看 | 波多野结衣电影久久 | 久久99久久99精品免费看小说 | 国产精品美女久久久久久免费 | 日本高清中文字幕有码在线 | 99久久国产免费看 | 色综合中文字幕 | 四虎在线免费 | 欧美日韩亚洲第一 | 国产精品爽爽久久久久久蜜臀 | av免费在线免费观看 | 国产三级香港三韩国三级 | 日本久久成人中文字幕电影 | 国产亚洲精品av | 九九视频在线播放 | 欧美成人日韩 | 在线观看国产永久免费视频 | 四虎成人精品永久免费av九九 | 99re6热在线精品视频 | 日韩aa视频 | 91亚洲成人| 伊人成人久久 | 国产精品一区在线观看你懂的 | 天天做综合网 | av在线8| 欧美日韩不卡在线观看 | 91视频免费观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产精品第二十页 | 久久精品国产99 | 精品视频成人 | av片子在线观看 | 免费在线观看一级片 | 在线 视频 亚洲 | 中文字幕亚洲精品在线观看 | 欧美一级激情 | 色成人亚洲网 | 久久精品精品电影网 | 成人久久久久久久久久 | 激情五月开心 | 国产在线看一区 | 成人免费视频在线观看 | 亚洲va欧美va | 久久精品福利 | 久久免费在线观看视频 | 91在线91| 国产一级不卡视频 | 在线免费观看麻豆视频 | 丁香婷婷色 | 午夜黄色一级片 | 日韩在线精品一区 | 国产欧美高清 | 精品人人人人 | 久久高清国产视频 | 亚洲午夜精品久久久久久久久久久久 | 4438全国亚洲精品在线观看视频 | 成人网页在线免费观看 | 天天干夜夜操视频 | 久久久亚洲麻豆日韩精品一区三区 | 久久免费在线观看 | 日韩在线中文字幕 | 久久久久久久久黄色 | 欧美日韩在线观看视频 | 国语精品免费视频 | 亚洲人av免费网站 | 国产高清99 | 在线高清 | 免费福利视频导航 | 免费a级黄色毛片 | 久久久午夜电影 | 午夜手机看片 | 91亚洲精品久久久 | 99久久婷婷国产 | 日韩av综合网站 | 亚洲亚洲精品在线观看 | 欧美,日韩 | 欧美性性网 | 婷婷久月 | 久久超 | 欧美在线观看视频免费 | 五月天av在线 | 日韩最新av在线 | 免费视频91蜜桃 | 西西人体www444 | 亚州中文av | 欧美一二三在线 | www视频在线观看 | 91精品视频导航 | 国产97在线视频 | 亚洲天堂网在线观看视频 | 国产精久久久久久久 | www.夜色321.com | 香蕉影视| 91国内产香蕉 | 久久精品99国产精品亚洲最刺激 | 亚洲女裸体| 欧美在线91 | 国产精品久久嫩一区二区免费 | 久久综合九色欧美综合狠狠 | 人人干天天射 | 久久久福利影院 | 日本久久久久久久久久久 | 久久精品日韩 | 久久免费视频5 | 中文字幕在线视频国产 | 亚洲精选视频免费看 | 一区二区网 | 久草免费在线视频观看 | 日韩高清一区在线 | 国产一区在线精品 | 99视频在线 | av性在线| 色亚洲网| 99精品99| 成人av一区二区在线观看 | 国产亚洲精品久久久久久大师 | 国产精品成人在线观看 | 国产拍揄自揄精品视频麻豆 | 欧美日韩首页 | 久久在线播放 | 国产69久久 | 久久99精品国产91久久来源 | 国产一区二区三区高清播放 | 午夜精品999 | 最新超碰 | 91麻豆精品国产91久久久更新时间 | 超碰免费久久 | 欧美视频99| av高清一区 | 久久国产99| 91九色视频在线播放 | 超碰人人干人人 | 黄色软件视频大全免费下载 | 亚洲久久视频 | 国产精品自产拍在线观看蜜 | 国产精品久久久久久久久毛片 | 在线精品视频免费播放 | 久久er99热精品一区二区三区 | 国产视频导航 | 久久久蜜桃一区二区 | 欧美激情精品久久久久久 | 色中文字幕在线观看 | 97在线免费视频观看 | 色中文字幕在线观看 | 久久香蕉国产 | 五月婷婷狠狠 | 综合精品在线 | 成人动漫一区二区三区 | 国产精品久久久久久久久久久杏吧 | 99视频精品视频高清免费 | 免费看污网站 | 蜜桃视频精品 | 国产色黄网站 | 99色视频 | 一级做a爱片性色毛片www | 久久精品女人毛片国产 | 国产一级一级国产 | 五月婷婷综合激情网 | а中文在线天堂 | 在线看小早川怜子av | av免费线看| 日韩av电影手机在线观看 | 欧美日韩国产一二三区 | 97精品国产97久久久久久粉红 | 婷婷av资源| 国内精品久久久久影院优 | 日韩欧美高清免费 | 日韩免费在线观看视频 | 米奇影视7777 | 国产裸体永久免费视频网站 | 国产做aⅴ在线视频播放 | 国产在线第三页 | 人成免费网站 | 免费网站在线观看人 | 伊人久久国产 | 亚洲婷婷在线 | 欧美性粗大hdvideo | 中文字幕91 | 久草视频精品 | 99久久婷婷国产综合精品 | 成人欧美一区二区三区在线观看 | 久久国产精品一区二区 | 99在线免费观看视频 | 欧美一区中文字幕 | av日韩中文 | 成人黄色大片在线免费观看 | 国产91对白在线播 | 在线观看日韩视频 | 在线免费黄色av | 亚洲国产一区二区精品专区 | av超碰在线 | 亚洲免费av在线 | 国产精品1区2区3区在线观看 | 我爱av激情网 | 久久官网 | 久久国产精品99国产精 | 久久久精品网 | 精品久久1| 免费看色视频 | 国产美女黄网站免费 | 手机看片久久 | 欧美日韩一区二区在线 | 午夜私人影院久久久久 | 西西www4444大胆在线 | 天天操夜夜拍 | 五月天中文字幕mv在线 | 免费大片黄在线 | 亚洲国产日韩一区 | 国产又粗又猛又色又黄网站 | 亚洲国产精久久久久久久 | 日本中文字幕在线观看 | 免费在线观看污 | 欧美日韩高清一区二区三区 | 欧美 激情 国产 91 在线 | 伊人婷婷激情 | 精品国产欧美 | 欧美成人黄色片 | 欧美狠狠操 | 国产日韩欧美自拍 | 日本中文字幕久久 | 免费在线观看av的网站 | 探花系列在线 | 一区二区三区福利 | 看片黄网站 | 男女全黄一级一级高潮免费看 | 精品国产乱码一区二区三区在线 | 久久国产精品电影 | 狠狠干干| 手机在线中文字幕 | 中文在线免费看视频 | av黄色亚洲| 奇米导航| 蜜桃av综合网 | 久久综合9988久久爱 | 午夜久久福利视频 | 又污又黄的网站 | 人人草人人草 | 久久免费片 | 粉嫩av一区二区三区四区在线观看 | 日韩在线首页 | 波多野结衣资源 | 免费在线观看国产黄 | 色婷婷视频 | 成人试看120秒 | 国产精品欧美日韩 | 亚洲涩涩色 | 97在线看 | 久久精品日产第一区二区三区乱码 | 日韩欧美成 | 精品国精品自拍自在线 | 九九久久婷婷 | 综合精品久久久 | 久操久 | 久草a在线| 日日夜夜91 | 婷婷九月激情 | 亚洲精品乱码久久久久久蜜桃欧美 | 免费一级毛毛片 | 91大神免费视频 | 99国产精品 | 欧美日一级片 | 亚洲激情综合 | 国产二区av| 久久久久久久电影 | 国产精品99久久久精品免费观看 | 日韩av在线免费播放 | 99视频免费观看 | 国产精品一区二区av麻豆 | 日韩高清成人在线 | 成人在线视频在线观看 | 国产精品女主播一区二区三区 | 五月开心婷婷 | 丁香激情婷婷 | 久久99久久99 | 欧美性色综合网 | 国产精品资源在线 | 天天操天天爽天天干 | 91精品国产91久久久久福利 | 九色精品免费永久在线 | 日韩精品视频网站 | 伊人手机在线 | 日韩精品国产一区 | 久久人人97超碰国产公开结果 | 麻花豆传媒mv在线观看网站 | 国产精品美女www爽爽爽视频 | 在线视频91 | 国产在线观看h | 国产中文字幕91 | 又黄又爽又刺激的视频 | 黄色a在线观看 | 亚洲精品视频久久 | www.久久爱.cn | 午夜精品一区二区三区在线观看 | 激情欧美一区二区三区 | av在线播放亚洲 | 久草在线高清视频 | 国模视频一区二区三区 | 国产精品丝袜久久久久久久不卡 | 免费看精品久久片 | 日韩二区在线观看 | 久久人人添人人爽添人人88v | 丁香久久激情 | 天天撸夜夜操 | 婷婷爱五月天 | 色狠狠婷婷 | 精品国产一区二区三区男人吃奶 | 久久精品中文字幕少妇 | 色婷婷99 | 免费观看的黄色 | 久草视频在线新免费 | 精品美女久久久久久免费 | 九九视频精品在线 | 日日综合网| 婷婷色网站 | 视频国产在线 | 91丨九色丨国产在线观看 | 久草色在线观看 | 久久免费福利视频 | 中国一区二区视频 | 亚洲综合日韩在线 | 国产资源精品 | 激情五月播播久久久精品 | 免费h漫在线观看 | 日韩精品中文字幕一区二区 | 久久夜色精品国产欧美乱极品 | 国产精品18videosex性欧美 | 亚洲精品啊啊啊 | 日日精品| av成人在线观看 | 成人av一级片 | 欧美精品中文在线免费观看 | 亚洲国产资源 | 国产一级免费观看 | 九九热精品视频在线播放 | 亚洲精品xxxx| 午夜国产福利在线 | 成年人app网址 | 四虎成人精品永久免费av | 免费毛片一区二区三区久久久 | 九热精品 | 久久99国产精品免费 | 久久久久高清毛片一级 | 91在线在线观看 | 丁香婷婷射 | 日韩免费中文 | 色噜噜狠狠色综合中国 | 中文字幕黄色网 | 江苏妇搡bbbb搡bbbb | 成人免费在线视频观看 | 天天摸天天操天天舔 | 91在线麻豆 | aaa日本高清在线播放免费观看 | 成年人在线免费视频观看 | 国产精品欧美在线 | 天天色婷婷 | 高清av在线免费观看 | 视频在线一区 | 狠狠干婷婷| 久草在线免费资源 | 天天摸天天弄 | 正在播放国产一区二区 | 免费av网站在线 | 久久99热精品这里久久精品 | 一区二区三区四区在线免费观看 | 中文字幕一区二区三区在线播放 | 国产精品系列在线播放 | 亚洲在线资源 | 亚洲综合国产精品 | 国产视频综合在线 | 久久第四色 | 一级免费观看 | 久久97久久 | 人人插人人插 | 久久久九色精品国产一区二区三区 | 亚洲国产日韩欧美 | 国产aaa毛片| 九九久久视频 | 日韩无在线 | 丁香婷婷综合色啪 | 国产97色在线| 五月天av在线| 日韩一区二区三区视频在线 | 成人亚洲欧美 | 欧洲精品一区二区 | 亚洲精欧美一区二区精品 | 精品久久免费看 | 久久成人一区二区 | 久久免费影院 | 麻豆视频一区二区 | 波多野结衣小视频 | 亚洲视频免费在线观看 | 久久人人看 | 日韩一二区在线观看 | 国产免费三级在线观看 | 国产精品18久久久久久vr | 国产亚洲亚洲 | 四虎免费在线观看 | 国内精品久久久久久久影视麻豆 | 午夜精品久久久久99热app | 日韩精品免费在线 | 99精品热 | 91精品国产九九九久久久亚洲 | 在线a人片免费观看视频 | 色婷婷骚婷婷 | av免费试看 | 欧美一级黄色视屏 | 超碰成人av | 国产无遮挡又黄又爽馒头漫画 | av福利在线播放 | 欧美在线你懂的 | 九九色在线观看 | 日韩欧美精品一区二区三区经典 | 久久人人做 | 欧美另类交在线观看 | 综合久久精品 | 免费av片在线 | 黄a在线观看 | 精品久久久久久久久亚洲 | 国产高清成人 | 伊人狠狠色丁香婷婷综合 | 亚洲激情六月 | 视频精品一区二区三区 | 激情五月av| 欧美五月婷婷 | 特级黄色一级 | 一本—道久久a久久精品蜜桃 | 五月婷婷色播 | 一区二区中文字幕在线观看 | 黄色片网站 | 久久精品视频免费播放 | 高清av免费看 | 午夜的福利 | 色综合天天 | 在线va网站 | 国产欧美久久久精品影院 | 国产精品18久久久久白浆 | 亚洲视频免费在线观看 | 蜜臀av夜夜澡人人爽人人 | 午夜视频久久久 | 国产区第一页 | 国产亚洲日本 | 国内精品久久久久久久 | 97综合视频 | 色吧av色av | 手机在线视频福利 | 国产精品12345 | 日本中文字幕在线播放 | 97视频播放 | 色婷婷一区 | 久草线 | 97超碰免费| 国产视频不卡一区 | 久久黄色精品视频 | 天堂网在线视频 | 国产剧情在线一区 | 三级黄免费看 | 8x成人免费视频 | 欧美日韩精品二区第二页 | 97小视频| 日日爽夜夜操 | 91在线视频精品 | 亚洲精品在线视频网站 | 天天天在线综合网 | 色综合久久综合中文综合网 | 在线观看中文av | 麻花传媒mv免费观看 | 天天操夜夜操天天射 | 久草在线观看视频免费 | 天天干天天干天天干天天干天天干天天干 | 91av视频播放| 日本久久精品视频 | 五月婷婷黄色网 | 日日草夜夜操 | 欧美日韩在线观看一区二区 | 欧美一级黄色片 | 精品特级毛片 | 亚洲国产精品成人va在线观看 | 免费高清看电视网站 | 欧美不卡在线 | 国产在线视频一区二区三区 | 超碰97人人在线 | 色综久久| 香蕉手机在线 | 国产精品自产拍在线观看蜜 | 久久经典国产视频 | 午夜精品久久久久久久99水蜜桃 | 亚洲区精品| 日韩精品中文字幕在线播放 | 日本午夜在线观看 | 中文字幕在线观看免费高清完整版 | 日韩在线视频二区 | 在线免费中文字幕 | 996久久国产精品线观看 | 狠狠干网站| 精品96久久久久久中文字幕无 | 一区中文字幕电影 | 欧美性生活免费 | 久久久久久久久综合 | 视频在线观看91 | 人人爽人人爽人人爽人人爽 | 伊人天堂av | 精品国产乱码久久久久久久 | 又粗又长又大又爽又黄少妇毛片 | 欧美日韩视频在线观看免费 | www.超碰97.com | 久久精品波多野结衣 | av亚洲产国偷v产偷v自拍小说 | 久久伦理电影 | a资源在线 | 日韩字幕在线观看 | 欧美精品在线观看免费 | 国产精品久久网 | 日韩最新在线 | 久久精品国产v日韩v亚洲 | 美女搞黄国产视频网站 | 亚洲国产精品女人久久久 | 麻豆免费精品视频 | 91精品中文字幕 | 欧美怡红院视频 | 亚洲国产中文字幕在线观看 | 久久国产视屏 | 日韩av快播电影网 | 国产视频2 | 国产成人久久久77777 | 一区精品在线 | 久久69精品久久久久久久电影好 | 91九色视频观看 | 久青草影院 | 91精品免费在线 | 亚洲国产成人在线播放 | 欧美日韩一区二区三区在线免费观看 | 亚洲人成网站精品片在线观看 | 欧美日在线| 91丨九色丨国产丨porny精品 | 日韩丝袜在线观看 | 波多野结衣在线中文字幕 | 三级视频国产 | 色综合久久久久综合体桃花网 | 一级片免费视频 | 狠狠干婷婷| 人人爽久久涩噜噜噜网站 | 免费欧美精品 | 国产在线色站 | 500部大龄熟乱视频使用方法 | 久久国产成人午夜av影院潦草 | 亚洲视频 视频在线 | 91毛片在线| 久草热久草视频 | 国产又粗又猛又色 | 91成人蝌蚪 | 免费在线电影网址大全 | 欧美国产一区在线 | 美国三级黄色大片 | 国产精品视频地址 | 久草观看 | 天天射天天爱天天干 | 日韩成人高清在线 | 精品美女久久久久久免费 | 特级毛片爽www免费版 | 美女黄频在线观看 | 久久一区二区三区超碰国产精品 | 天堂av在线网 | 中文区中文字幕免费看 | 国产99久久久国产精品免费看 | 久久九九久久九九 | 国产高清精品在线 | 久久av影院 | av久久久 | 日韩欧美中文 | 日韩精品一区二区三区外面 | 久久久免费观看视频 | 中文字幕欧美日韩va免费视频 | 片黄色毛片黄色毛片 | 亚洲综合国产精品 | www.色午夜 | 久久精精品视频 | 色综合久久综合中文综合网 | 国精产品一二三线999 | 91传媒在线看 | 国产精品久久婷婷六月丁香 | 国产成人精品久久 | 黄色片亚洲 | 国语黄色片 | 亚洲日本成人 | 天天爱天天操天天爽 | 在线看的av网站 | 97视频入口免费观看 | 亚洲精品高清在线观看 | 四虎影视成人精品国库在线观看 | 色婷婷电影网 | 国产97碰免费视频 | av片在线观看 | 天天想夜夜操 | 日韩精品一区二区三区水蜜桃 | 97福利视频 | 五月婷婷中文字幕 | 亚洲欧美日韩国产精品一区午夜 | 天天舔天天射天天操 | 免费观看丰满少妇做爰 | 9999亚洲| 中文字幕第一页在线播放 | 国产91探花| 国产精品成人一区二区 | 玖玖视频在线 | av中文字幕免费在线观看 | 久久艹在线观看 | 97精品久久人人爽人人爽 | 国产精品99久久久 | 又长又大又黑又粗欧美 | 成人午夜性影院 | 国产黄免费在线观看 | 久久久一本精品99久久精品66 | 激情综合五月 | 激情久久久久久久久久久久久久久久 | 日韩欧美视频免费在线观看 | 黄色的视频网站 | 丁香花在线观看免费完整版视频 | 亚洲人精品午夜 | 激情伊人五月天 | 国产黄色成人 | 四虎天堂 | 色天天综合久久久久综合片 | 久久国产精品二国产精品中国洋人 | 亚洲人成人在线 | 91经典在线 | 欧美一级大片在线观看 | 国产日韩视频在线 | 国产一区二区久久精品 | 很黄很黄的网站免费的 | 久久综合激情 | 在线看毛片网站 | 亚洲国产精品久久 | 免费高清看电视网站 | 91禁在线看 | 激情丁香月 | 伊人色综合久久天天网 | 亚洲精品人人 | 国产精品自在欧美一区 | 欧美在线视频一区二区三区 | 国产美女精品视频 | 中文字幕 91 | 日韩欧美在线观看一区二区 | 深爱婷婷久久综合 | av福利网址导航大全 | 九九热精品视频在线播放 | av电影在线免费 | 欧美日韩在线播放 | 国产精品高潮呻吟久久久久 | 在线电影播放 | 美腿丝袜一区二区三区 | 国产精品18久久久久久首页狼 | 色噜噜日韩精品一区二区三区视频 | 久久99精品久久久久久清纯直播 | 色狠狠婷婷 | 国产精品久久久久久欧美 | 五月开心六月婷婷 | 国产呻吟在线 | 欧洲精品久久久久毛片完整版 | www.av免费观看 | 中文字幕欧美日韩va免费视频 | 天天综合天天做天天综合 | 免费福利在线播放 | 97av在线视频 | 国产精品久久久久久久妇 | 亚洲精品小视频 | 欧美精品在线观看一区 | www.香蕉视频在线观看 | 97超碰网 | 狠狠的操 | 91在线91| 国产精品高潮呻吟久久av无 | 射射色 | 日日躁夜夜躁xxxxaaaa | 99国产精品久久久久老师 | 亚洲欧美在线视频免费 | 国产免费中文字幕 | 亚洲国产丝袜在线观看 | 久草在线视频免费资源观看 | 亚洲欧美日韩精品久久奇米一区 | 很黄很黄的网站免费的 | 欧美日韩在线观看视频 | 99精品国产视频 | 欧美最猛性xxxxx亚洲精品 | 国产视频99 | 日韩av免费观看网站 | 黄色片网站免费 | 一本一本久久aa综合精品 | 日韩免费一级a毛片在线播放一级 | 久久国产热视频 | 免费看黄色91 | 中文字幕在线观看第三页 | 狠狠干电影| 日本高清dvd| 右手影院亚洲欧美 | 欧美日韩久久久 | 午夜视频在线观看欧美 | 丁香婷婷色月天 | 一区二区三区在线电影 | 欧美日韩69 | 91麻豆视频| 久久丁香| 国产午夜一区 | 国产日韩视频在线 | 免费a v网站 | 久操97| 成人中心免费视频 | 欧美怡红院 | 国内免费的中文字幕 | 欧美久草网 | 一区二区三区久久 | 欧美日本三级 | 国产亚洲字幕 | 国产高清在线免费视频 | 2021国产在线视频 | 99在线国产 | 日韩欧美在线免费观看 | 日韩欧美在线视频一区二区三区 | av一区二区三区在线观看 | 久艹视频免费观看 | 亚洲精品国产日韩 | 波多野结衣精品视频 | 久久久久日本精品一区二区三区 | www五月婷婷 | 免费高清无人区完整版 | 国产精品久久久久久久久大全 | 久久精品中文 | 中文字幕av一区二区三区四区 | 久久人人爽人人爽人人片av软件 | 久久九九久久九九 | 亚州精品成人 | 亚洲永久精品一区 | 干狠狠| 色综合久久综合中文综合网 | 日本在线视频一区二区三区 | 久久涩视频 | 欧美福利网址 | 色婷婷亚洲婷婷 | 91久久精品日日躁夜夜躁国产 | 四虎www com| 黄色毛片网站在线观看 | 欧美地下肉体性派对 | 国产精彩在线视频 | av片一区 | 99在线热播精品免费 | 亚洲专区 国产精品 | 亚洲欧美日韩不卡 | 亚洲欧美日本一区二区三区 | 久草观看 | 高清日韩一区二区 | 99在线热播精品免费99热 | 五月婷婷丁香六月 | 黄色aaaaa | 色婷婷中文 | 久久久91精品国产 | 欧美色操 | 亚洲免费av一区二区 | 日韩精品不卡在线观看 | 亚洲精品九九 | 国产精品一区二区在线观看 | 色视频网址 | 成人午夜黄色 | 久久韩国免费视频 | 999成人 | 亚洲欧美激情精品一区二区 | 久久视频免费看 | 美女视频一区二区 | 欧美人体xx| 精品久久久国产 | 一区二区视频在线免费观看 | 操操操日日日干干干 | 成人免费xxx在线观看 | 五月亚洲 | 三级视频日韩 | 国产一区福利 | 九九亚洲精品 | 亚洲国产一二三 | 99riav1国产精品视频 | 97精品国产一二三产区 | 不卡的av在线 | 一级片免费观看视频 | 久久久精品网 | 亚洲国产中文字幕在线观看 | 黄色一级片视频 | 9999国产精品 | 二区精品视频 | 天天操网站 | 91九色蝌蚪在线 | 成人国产精品免费 | 黄色成人av| 久久99久久99 | 日韩视频中文字幕在线观看 | av超碰在线观看 | 国产黄大片在线观看 | 成人免费在线观看入口 | 丁香六月久久综合狠狠色 | 欧美ⅹxxxxxx | 天天拍天天色 | 国产精品丝袜 | 深夜免费小视频 | 婷婷5月激情5月 | 久久精品精品电影网 | 欧美日韩另类在线 | 狠狠色丁香婷婷综合久小说久 | 亚洲三级黄色 | 国产原厂视频在线观看 | 香蕉视频久久久 | 91九色视频在线播放 | 国产精品久久久视频 | 精品国产乱码久久 | 97精品国产97久久久久久久久久久久 | 成人啪啪18免费游戏链接 | 西西444www大胆无视频 | 午夜视频播放 | 成人a大片| 久久久久久久久久久久影院 | 国产精品久久久久久久久免费看 | 日韩av综合网站 | 91在线精品秘密一区二区 | av免费看电影 | 亚色视频在线观看 | 最新国产精品拍自在线播放 | 97日日 | 亚洲精品国产精品国自产观看浪潮 | 97在线看片 | 国产91精品高清一区二区三区 | 黄网站色成年免费观看 | 久久国产视频网站 | 久久成人一区二区 | 丁香花中文在线免费观看 | 成人免费视频网站在线观看 | 日韩精品一区二区三区三炮视频 | 日韩 在线 | 亚洲精品视频在线播放 | 免费观看一级成人毛片 | 精品视频免费播放 | 精品国产一二三四区 | 性色av一区二区三区在线观看 | 少妇bbb搡bbbb搡bbbb′ | 激情五月婷婷 | 2024av| 日韩在线大片 | 麻豆国产精品va在线观看不卡 | 国产精品18久久久久久首页狼 | 九月婷婷综合网 | 日韩网站在线免费观看 | 国产精品一区二区久久精品爱涩 | 成人久久久电影 | 国产高清在线免费 | 国产精品成人av久久 | 伊人国产在线观看 | 国模视频一区二区三区 | 三级视频国产 | 国产一区在线播放 | www.色五月.com | 免费高清在线一区 | 成人啊 v| 中文字幕在线观看三区 | 国产精品网址在线观看 | 亚洲国产精品推荐 | 欧美日韩国产综合一区二区 |