python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估
主要內容數據向量化處理
特征放縮
上采樣和下采樣
重采樣和交叉驗證
模型驗證
python 代碼實現
1. 數據向量化處理
對于給定的m個樣本,假設最終的擬合函數是
為擬合的權重系數,則有
損失函數改寫為矩陣形式
由于
, 可以得出
有公式以得到損失函數的向量表達式
2. 特征放縮
在實際中,我們不同特征的尺度大小,取值范圍可能可能相差很大
例如,我們有兩個特征,分別是房子的面積以及房子的臥室數。房子的面積取值范圍大約是0~300,而臥室數的取值范圍在0~5。這樣的話,如果我們把它們關于代價函數的等高線圖繪制出來的話,形如狹長同心橢圓,一個狹長的橢圓在逼近收斂的時候就會產生震蕩,因為橫軸方向的參數只要略微變化等高線圖中顯示的損失函數就會劇烈變化,從而影響收斂準確性。我們的目標是我們特征放縮的目標是把所有的特征放到同一個數量級下面。
方法:均值標準化(Mean normalization)
使用特征值減去它的均值,然后再除以它們的最大值.
3. 過擬合和欠擬合
簡單理解:過擬合是在訓練數據上表現良好,在未知數據上表現差,欠擬合在訓練數據和未知數據上表現都很差。
首先了解泛化概念
泛化:機器學習模型學習到的概念在它處于學習的過程中時模型沒有遇見過的樣本時候的表現。在機器學習領域中,當我們討論一個機器學習模型學習和泛化的好壞時,我們通常使用術語,過擬合和欠擬合.
從訓練數據中學習目標函數的過程中,我們必須考慮的問題是模型在預測新數據時的泛化性能。泛化好壞是很重要的,因為我們收集到的數據只是樣本,其帶有噪音并且是不完全的。
Note:如果我們已經知道了目標函數的形式,我們將可以直接用它來做預測,而不是從一堆有噪音的數據中把它費力的學習出來。
機器學習中的過擬合
當某個模型過度的學習訓練數據中的細節和噪音,以至于模型在新的數據上表現很差。這意味著訓練數據中的噪音或者隨機波動也被當做概念被模型學習了。而問題就在于這些概念不適用于新的數據,從而導致模型泛化性能的變差。
過擬合更可能在無參數非線性模型中發生,因為學習目標函數的過程是易變的具有彈性的。同樣的,許多的無參數機器學習算法也包括限制約束模型學習概念多少的參數或者技巧。例如,決策樹就是一種無參數機器學習算法,非常有彈性并且容易受過擬合訓練數據的影響。這種問題可以通過對學習過后的樹進行剪枝來解決,這種方法就是為了移除一些其學習到的細節。
機器學習中的欠擬合
欠擬合指的是模型在訓練和預測時表現都不好的情況。欠擬合通常不被討論,因為給定一個評估模型表現的指標的情況下,欠擬合很容易被發現。矯正方法是繼續學習并且試著更換機器學習算法。雖然如此,欠擬合與過擬合形成了鮮明的對照。
兩種解決方式:重采樣方法和驗證集方法。
使用重采樣來評價模型效能, 最流行的重采樣技術是k折交叉驗證。指的是在訓練數據的子集上訓練和測試模型k次,同時建立對于機器學習模型在未知數據上表現的評估。
驗證集只是訓練數據的子集,你把它保留到你進行機器學習算法的最后才使用。在訓練數據上選擇和調諧機器學習算法之后,我們在驗證集上在對于模型進行評估,以便得到一些關于模型在未知數據上的表現的認知。
4. 重采樣和交叉驗證(Cross Validation)
重采樣:
重采樣基于實際數據生成一個獨特的采樣分布。它使用經驗性方法,而不是分析方法,來生成該采樣分布。重采樣基于數據所有可能結果的無偏樣本獲取無偏估計
交叉驗證:
在使用訓練集對參數進行訓練的時候,通常會將一整個訓練集分為三個部分訓練集(train_set),評估集(valid_set),測試集(test_set)這三個部分。這其實是為了保證訓練效果而特意設置的。其中測試集很好理解,其實就是完全不參與訓練的數據,僅僅用來觀測測試效果的數據。在實際的訓練中,訓練的結果對于訓練集的擬合程度通常還是挺好的(初始條件敏感),但是對于訓練集之外的數據的擬合程度通常就不那么令人滿意了。因此我們通常并不會把所有的數據集都拿來訓練,而是分出一部分來(這一部分不參加訓練)對訓練集生成的參數進行測試,相對客觀的判斷這些參數對訓練集之外的數據的符合程度。這種思想就稱為交叉驗證(Cross Validation)
常見的交叉驗證方式:
1)k-folder cross-validation:
k個子集,每個子集均做一次測試集,其余的作為訓練集。交叉驗證重復k次,每次選擇一個子集作為測試集,并將k次的平均交叉驗證識別正確率作為結果。
優點:所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10-folder通常被使用。
2)K * 2 folder cross-validation
是k-folder cross-validation的一個變體,對每一個folder,都平均分成兩個集合s0,s1,我們先在集合s0訓練用s1測試,然后用s1訓練s0測試。
優點是:測試和訓練集都足夠大,每一個個樣本都被作為訓練集和測試集。一般使用k=10
3)least-one-out cross-validation(loocv)
假設dataset中有n個樣本,那LOOCV也就是n-CV,意思是每個樣本單獨作為一次測試集,剩余n-1個樣本則做為訓練集。
優點:
1)每一回合中幾乎所有的樣本皆用于訓練model,因此最接近母體樣本的分布,估測所得的generalization error比較可靠。
2)實驗過程中沒有隨機因素會影響實驗數據,確保實驗過程是可以被復制的。
但LOOCV的缺點則是計算成本高,為需要建立的models數量與總樣本數量相同,當總樣本數量相當多時,LOOCV在實作上便有困難,除非每次訓練model的速度很快,或是可以用平行化計算減少計算所需的時間。
5. 模型的評估方法
上式的結果越接近于1 表明擬合的結果越好
6. Python 代碼實現
下面以信用卡異常檢測為案例,來鞏固復習以上知識點。以下代碼整理自屈大神視頻。
導入三大件和數據
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("creditcard.csv")
data.head() # 查看數據頭
X =data.loc[:,data.columns != 'Class'] # 特征列
Y =data.loc[:,data.columns == 'Class'] # 標簽列
number_records_fraud = len(data[data.Class==1])# 計算失信人員個數
# 把索引取出,建立一個數據標簽的一維數組
fraud_indices = np.array(data[data.Class == 1].index) # 異常索引
normal_indices = np.array(data[data.Class != 1].index) # 正常索引
下采樣 Undersample
# 隨機的在正常的數據中選擇與異常數據個數相同的正常數據點,并建立數組
random_normal_indices = np.random.choice(normal_indices,
\number_records_fraud,replace=False)
random_normal_indices = np.array(random_normal_indices) # 建立一維數組
# under_sample
under_sample_indices = np.concatenate([fraud_indices,random_normal_indices])
under_sample_data = data.iloc[under_sample_indices,:]
X_undersample = under_sample_data.loc[:,under_sample_data.columns !='Class']
Y_undersample = under_sample_data.loc[:,under_sample_data.columns =='Class']
#print ('percent', len(under_sample_data[under_sample_data.Class==0] / len(under_sample_data)))
# 劃分數據
from sklearn.model_selection import train_test_split
#whole dataset
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size =0.3,random_state=0)
# test_size 切分比例
# undersample
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample =
\train_test_split(X_undersample,Y_undersample,test_size =0.3,random_state=0)
導入sklearn 相關庫
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold, cross_val_score
from sklearn.metrics import confusion_matrix, recall_score, classification_report
交叉驗證
def printing_Kfold_scores (x_train_data, y_train_data):
fold = KFold(5, shuffle=False)
#print (fold.get_n_splits()) #5
c_param_range = [0.01,0.1,1,10,100] # 懲罰力度
results_table = pd.DataFrame(index = range(len(c_param_range),2),
\columns=['C-parameter','mean recall s'] )
j=0
for c_param in c_param_range:
print ('________________________________')
print ('C parameter : ',c_param)
print ('________________________________')
print ('')
recall_accs =[]
# 交叉驗證
for iteration, indices in enumerate(fold.split(y_train_data), start=1):
lr = LogisticRegression(C= c_param, penalty= 'l1')# C 懲罰力度
lr.fit(x_train_data.iloc[indices[0],:], y_train_data.iloc[indices[0],:].values.ravel())
y_pred_undersample= lr.predict(x_train_data.iloc[indices[1],:].values)
recall_acc =recall_score(y_train_data.iloc[indices[1],:].values, y_pred_undersample)
recall_accs.append(recall_acc)
print ('Iteration', iteration, ':recall score =', recall_acc)
results_table.loc[j,'Mean recall score']= np.mean(recall_accs)
j+=1
print ('')
print ('Mean recall score', np.mean(recall_accs))
print ('')
best_c = results_table.loc[results_table['Mean recall score'].idxmax()]['C_parameter']
print('************************************************************************************')
print ('best model to choose from cross vaildation is with C parameter =', best_c)
print('************************************************************************************')
return best_c
best_c = printing_Kfold_scores(X_train_undersample, y_train_undersample)
#best_c_1 = printing_Kfold_scores(X_train,y_train) #原始數據集進行訓練
lr = LogisticRegression (C=best_c, penalty = 'l1')
lr.fit(X_train, y_train.values.ravel)
y_pred_undersample = lr.predict(X_test.values)
cnf_matrix = confusion_matrix(y_test,y_pred_undersample)
np.set_printoptions(precision =2)
print ('Recall matric in the testing dataset', cnf_matrix[1,1]/(cnf_matrix[1,0] + cnf_matrix[1,1]))
class_names = [0,1]
plt.figure()
plot_confusion_matrix(cnf_matrix,
classes = class_names,
title='confusion matrix')
plt.show()
總結
以上是生活随笔為你收集整理的python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp实现mysql存储过程_JSP调用
- 下一篇: java访问器_Java中的访问器方法