當前位置:首頁 » 編程語言 » onehotpython

onehotpython

發布時間: 2023-01-29 21:38:10

1. 基於python的prosper借貸平台之數據分析

項目介紹:

p2p 借貸業務具有門檻低,渠道成本低的特性,風險防控對於出借企業來說非常重要。本項目需要

從大量借貸者的數據集中分析出容易違約和不容易違約的人群畫像特徵,以給業務做貸前決策使

用。同時使用機器學習演算法,實現自動識別風險人群(精準率為 89.86%),加快人工審查效率。

項目具體內容:

1、使用 python pandas 工具進行數據清洗、缺失值、異常值處理以及特徵指標篩選。

2、使用 python matplotlib 可視化工具進行探索式數據分析,展示用戶關鍵特徵如月收入、信用卡

透支情況對於違約率的影響情況。

3、使用機器學習隨機森林進行建模分析,使用學習曲線、網格搜索、交叉驗證,最終得到了一個評

分為 84.9%、精準率為 89.86%、召回率為 80.70%、auc 面積為 0.9337 數據預測模型。

    本次數據訓練使用的模型是隨機森林分類演算法,通過對預處理過的數據集進行訓練,使用學習曲線、網格搜索、交叉驗證。最終得到了一個評分為84.9%、精準率為89.86%、召回率為80.70%、 auc面積為0.9337 數據預測模型。 

數據預處理的基本流程與思路:

1、首先要明確有多少特徵,哪些是連續的,哪些是類別的。

2、檢查有沒有缺失值,對確實的特徵選擇恰當方式進行彌補,使數據完整。

3、對連續的數值型特徵進行標准化,使得均值為0,方差為1。

4、對類別型的特徵進行one-hot編碼。

5、將需要轉換成類別型數據的連續型數據進行二值化。

6、為防止過擬合或者其他原因,選擇是否要將數據進行正則化。

7、在對數據進行初探之後發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關系。

8、根據實際問題分析是否需要對特徵進行相應的函數轉換。

導入數據集,並查看數據基本情況。可以看到prosper原始數據量比較龐大,一個有113937個樣本,80個特徵列,1個標簽列。

1.1、特徵較多,先共刪減一部分無用的特徵。

1.2 查看數據缺失情況,可以看到有40個特徵是存在數據缺失的,缺失率從0.000219-0.882909不等。下面處理缺失數據。

1.2.1 刪除缺失值比較多的特徵

下面兩個特徵缺失率太高,且與我們要分析的相關性不大,直接刪除掉。

1.2.2 獲取數據類型是分類變數的所有特徵,並使用unknown進行填充

1.2.3 特殊變數使用計算公式進行填充

1.2.4 去掉意義重復列

1.2.5 刪除缺失率比較少的特徵的缺失數據行

處理完缺失數據後,樣本量為106290,特徵量為55

1.3 數據過濾

1.3.1 從2009年7月開始,Prosper調整了對客戶的評估方式,此次我們只對2009-07-01後的貸款進行分析。

過濾完數據後,樣本量變為82931,特徵量為54

2.1單變數分析

0為未違約人數,1位違約人數,可以看到2009.07以後,違約率為22.90%

2.1.1不同地區貸款數量分布

從圖中可以看到加利福尼亞州貸款數量遠比其他州的數量高。由於prosper總部就位於加利福尼亞州,這與實際情況一致。其他排名靠前的分別是得克薩斯、紐約、佛羅里達、伊利諾伊,貸款數據均超過了5000條。根據2015年美國各州的GDP排名,這5個州剛好排名前五,而且順序也是一致的。說明Prosper平台的用戶主要分布在美國經濟發達的地區。

2.1.2 貸款人收入情況分布

年薪在25000美金以上在美國屬於技術性白領或者有一定學歷的職員,50000美金已經是近金領階層,比如:大學教授,醫生等。從圖中可以看出Prosper平台用戶的收入水平都相對較高,有利於用戶還款,利於平台和投資者的風險控制。

2.1.3貸款人職業分布

從圖中可以看出,除了不願意透露具體職業的人,大部分用戶是教授、程序員、企業高管等具有一定社會地位的人,這部分人受過高等教育,信用有一定保障。另外,這與之前看到的收入情況相符。

2.1.4貸款人債務收入比分布

大部分用戶的債務收入比在0.2左右,超過0.5的占很少部分。說明Prosper平台用戶的還款能力還是比較樂觀的

2.1.5 貸款者信用卡使用情況

BankcardUtilization代表的是信用卡使用金額和信用卡額度的比值,可以體現用戶的資金需求。Prosper用戶多是0.5~1之間,說明用戶每個月還有信用卡要還,降低了其還款能力。

2.2 相關的關鍵因素對貸款違約率的影響

2.2.1借貸人收入IncomeRange對違約率的影響

從圖中可以看出:

1.一般來說收入越高違約率越低

2.貸款的人員主要集中在中等收入群體

2.2.2 債務收入比DebtToIncomeRatio對違約率的影響

從上圖可以看出:

1.債務收入比小於0.6時,違約數明顯小於未違約數,

2.當債務收入比大於0.6時,兩者的差距不是很明顯甚至違約數大於未違約數,說明了債務收入比越大的人越容易違約

2.2.3 借款人BankcardUtilization對違約率的影響

1.總的來說,隨著信用卡的透支比例越來越高,違約率也越來越高

2.SuperUse的違約率到了37.5%,這部分人群需要嚴格了監控,No Use人群也有31%的違約率,當初將信用卡透支比例為0和NA的數據都歸類為No Use,顯然沒有這么簡單,應該是大部分人群的NA值是為了隱藏自己的高透支比例而填寫的

2.2.4 消費信用分CreditScoreRange對違約率的影響

從上圖可以看出:

1.隨著信用分數CreditScore的上升,它的違約率在下降

2.大部分貸款者的信用分為650-800,違約率在0.06-0.02

2.2.5 過去7年借款人違約次數DelinquenciesLast7Years對違約率的影響

過去七年違約次數(DelinquenciesLast7Years)能夠衡量一個人在過去七年中徵信情況,違約一次或以上的人在借款時違約概率更大。

 從上圖可以看出:

1.總體來說過去7年違約次數越多,違約率越高

2.過去7年未違約的人數相對來說比其他違約的人數高很多,具體看下面的分析

3.1 數據轉化

3.1.1類變數進行啞變數化

樣本量變為82931,特徵量為127

3.1.2 標簽變數進行二分類

已完成貸款的樣本量變為26365,特徵量為127

未違約率為:0.7709084012895885;違約率為0.22909159871041151

3.2 至此,數據預處理的工作就告一段落,保存預處理好的數據。

 導入經過預處理的prosper借貸數據集

4.1 手工挑選特徵查看一下建模效果

准確率為0.7695

4.2 使用模型自己選取特徵

准確率為0.7780

4.3 使用學習曲線選取最優n_estimators

在0-200/20內學習,得到最優n_estimators=161,score = 0.8508

在151-171/20內學習,得到最優n_estimators=163,score = 0.8511

4.4 使用網格搜索調其他參數

在0-60/5內學習,得到最優max_depth=41

在0-60/5內學習,得到最優max_features=16

這里由於比較耗時,沒有進一步細化選擇更高的參數

4.4 最終模型效果

最終准確率 0.8490528905289052

混淆矩陣 :

[[5552  554]

[1175 4914]]

精準率 : [0.82533076 0.89868325]

召回率 : [0.90926957 0.80702907]

roc和auc面積為0.9337

4.5 查看各特徵的重要性

4.6 數據預測

預測的違約率0.0427

2. word2vec怎麼生成詞向量python

:將one-hot向量轉換成低維詞向量的這一層(雖然大家都不稱之為一層,但在我看來就是一層),因為word2vec的輸入是one-hot。one-hot可看成是1*N(N是詞總數)的矩陣,與這個系數矩陣(N*M, M是word2vec詞向量維數)相乘之後就可以得到1*M的向量,這個向量就是這個詞對應的詞向量了。那麼對於那個N*M的矩陣,每一行就對應了每個單詞的詞向量。接下來就是進入神經網路,然後通過訓練不斷更新這個矩陣。

3. 如何用Python對人員軌跡聚類

把你的 xy 變換成 onehot編碼 ,這樣的話 聚類演算法就都可以兼容了,
KMeans, DBScan, 層次聚類,等等都是可以的

4. 如何在Python中用LSTM網路進行時間序列預測

時間序列模型

時間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測未來一段時間內該事件的特徵。這是一類相對比較復雜的預測建模問題,和回歸分析模型的預測不同,時間序列模型是依賴於事件發生的先後順序的,同樣大小的值改變順序後輸入模型產生的結果是不同的。
舉個栗子:根據過去兩年某股票的每天的股價數據推測之後一周的股價變化;根據過去2年某店鋪每周想消費人數預測下周來店消費的人數等等

RNN 和 LSTM 模型

時間序列模型最常用最強大的的工具就是遞歸神經網路(recurrent neural network, RNN)。相比與普通神經網路的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。

典型的RNN網路結構如下:

4. 模型訓練和結果預測
將上述數據集按4:1的比例隨機拆分為訓練集和驗證集,這是為了防止過度擬合。訓練模型。然後將數據的X列作為參數導入模型便可得到預測值,與實際的Y值相比便可得到該模型的優劣。

實現代碼

  • 時間間隔序列格式化成所需的訓練集格式

  • import pandas as pdimport numpy as npdef create_interval_dataset(dataset, look_back):

  • """ :param dataset: input array of time intervals :param look_back: each training set feature length :return: convert an array of values into a dataset matrix. """

  • dataX, dataY = [], [] for i in range(len(dataset) - look_back):

  • dataX.append(dataset[i:i+look_back])

  • dataY.append(dataset[i+look_back]) return np.asarray(dataX), np.asarray(dataY)


  • df = pd.read_csv("path-to-your-time-interval-file")

  • dataset_init = np.asarray(df) # if only 1 columndataX, dataY = create_interval_dataset(dataset, lookback=3) # look back if the training set sequence length

  • 這里的輸入數據來源是csv文件,如果輸入數據是來自資料庫的話可以參考這里

  • LSTM網路結構搭建

  • import pandas as pdimport numpy as npimport randomfrom keras.models import Sequential, model_from_jsonfrom keras.layers import Dense, LSTM, Dropoutclass NeuralNetwork():

  • def __init__(self, **kwargs):

  • """ :param **kwargs: output_dim=4: output dimension of LSTM layer; activation_lstm='tanh': activation function for LSTM layers; activation_dense='relu': activation function for Dense layer; activation_last='sigmoid': activation function for last layer; drop_out=0.2: fraction of input units to drop; np_epoch=10, the number of epoches to train the model. epoch is one forward pass and one backward pass of all the training examples; batch_size=32: number of samples per gradient update. The higher the batch size, the more memory space you'll need; loss='mean_square_error': loss function; optimizer='rmsprop' """

  • self.output_dim = kwargs.get('output_dim', 8) self.activation_lstm = kwargs.get('activation_lstm', 'relu') self.activation_dense = kwargs.get('activation_dense', 'relu') self.activation_last = kwargs.get('activation_last', 'softmax') # softmax for multiple output

  • self.dense_layer = kwargs.get('dense_layer', 2) # at least 2 layers

  • self.lstm_layer = kwargs.get('lstm_layer', 2) self.drop_out = kwargs.get('drop_out', 0.2) self.nb_epoch = kwargs.get('nb_epoch', 10) self.batch_size = kwargs.get('batch_size', 100) self.loss = kwargs.get('loss', 'categorical_crossentropy') self.optimizer = kwargs.get('optimizer', 'rmsprop') def NN_model(self, trainX, trainY, testX, testY):

  • """ :param trainX: training data set :param trainY: expect value of training data :param testX: test data set :param testY: epect value of test data :return: model after training """

  • print "Training model is LSTM network!"

  • input_dim = trainX[1].shape[1]

  • output_dim = trainY.shape[1] # one-hot label

  • # print predefined parameters of current model:

  • model = Sequential() # applying a LSTM layer with x dim output and y dim input. Use dropout parameter to avoid overfitting

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=input_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out,

  • return_sequences=True)) for i in range(self.lstm_layer-2):

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out,

  • return_sequences=True)) # argument return_sequences should be false in last lstm layer to avoid input dimension incompatibility with dense layer

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out)) for i in range(self.dense_layer-1):

  • model.add(Dense(output_dim=self.output_dim,

  • activation=self.activation_last))

  • model.add(Dense(output_dim=output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_last)) # configure the learning process

  • model.compile(loss=self.loss, optimizer=self.optimizer, metrics=['accuracy']) # train the model with fixed number of epoches

  • model.fit(x=trainX, y=trainY, nb_epoch=self.nb_epoch, batch_size=self.batch_size, validation_data=(testX, testY)) # store model to json file

  • model_json = model.to_json() with open(model_path, "w") as json_file:

  • json_file.write(model_json) # store model weights to hdf5 file

  • if model_weight_path: if os.path.exists(model_weight_path):

  • os.remove(model_weight_path)

  • model.save_weights(model_weight_path) # eg: model_weight.h5

  • return model

  • 這里寫的只涉及LSTM網路的結構搭建,至於如何把數據處理規范化成網路所需的結構以及把模型預測結果與實際值比較統計的可視化,就需要根據實際情況做調整了。

    熱點內容
    java返回this 發布:2025-10-20 08:28:16 瀏覽:582
    製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:876
    python中的init方法 發布:2025-10-20 08:17:33 瀏覽:571
    圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:757
    怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:673
    c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1000
    郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:244
    shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:103
    怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:795
    python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:701