日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估

發(fā)布時間:2025/4/16 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

主要內(nèi)容數(shù)據(jù)向量化處理

特征放縮

上采樣和下采樣

重采樣和交叉驗證

模型驗證

python 代碼實現(xiàn)

1. 數(shù)據(jù)向量化處理

對于給定的m個樣本,假設(shè)最終的擬合函數(shù)是

為擬合的權(quán)重系數(shù),則有

損失函數(shù)改寫為矩陣形式

由于

, 可以得出

有公式以得到損失函數(shù)的向量表達式

2. 特征放縮

在實際中,我們不同特征的尺度大小,取值范圍可能可能相差很大

例如,我們有兩個特征,分別是房子的面積以及房子的臥室數(shù)。房子的面積取值范圍大約是0~300,而臥室數(shù)的取值范圍在0~5。這樣的話,如果我們把它們關(guān)于代價函數(shù)的等高線圖繪制出來的話,形如狹長同心橢圓,一個狹長的橢圓在逼近收斂的時候就會產(chǎn)生震蕩,因為橫軸方向的參數(shù)只要略微變化等高線圖中顯示的損失函數(shù)就會劇烈變化,從而影響收斂準確性。我們的目標是我們特征放縮的目標是把所有的特征放到同一個數(shù)量級下面。

方法:均值標準化(Mean normalization)

使用特征值減去它的均值,然后再除以它們的最大值.

3. 過擬合和欠擬合

簡單理解:過擬合是在訓練數(shù)據(jù)上表現(xiàn)良好,在未知數(shù)據(jù)上表現(xiàn)差,欠擬合在訓練數(shù)據(jù)和未知數(shù)據(jù)上表現(xiàn)都很差。

首先了解泛化概念

泛化:機器學習模型學習到的概念在它處于學習的過程中時模型沒有遇見過的樣本時候的表現(xiàn)。在機器學習領(lǐng)域中,當我們討論一個機器學習模型學習和泛化的好壞時,我們通常使用術(shù)語,過擬合和欠擬合.

從訓練數(shù)據(jù)中學習目標函數(shù)的過程中,我們必須考慮的問題是模型在預(yù)測新數(shù)據(jù)時的泛化性能。泛化好壞是很重要的,因為我們收集到的數(shù)據(jù)只是樣本,其帶有噪音并且是不完全的。

Note:如果我們已經(jīng)知道了目標函數(shù)的形式,我們將可以直接用它來做預(yù)測,而不是從一堆有噪音的數(shù)據(jù)中把它費力的學習出來。

機器學習中的過擬合

當某個模型過度的學習訓練數(shù)據(jù)中的細節(jié)和噪音,以至于模型在新的數(shù)據(jù)上表現(xiàn)很差。這意味著訓練數(shù)據(jù)中的噪音或者隨機波動也被當做概念被模型學習了。而問題就在于這些概念不適用于新的數(shù)據(jù),從而導(dǎo)致模型泛化性能的變差。

過擬合更可能在無參數(shù)非線性模型中發(fā)生,因為學習目標函數(shù)的過程是易變的具有彈性的。同樣的,許多的無參數(shù)機器學習算法也包括限制約束模型學習概念多少的參數(shù)或者技巧。例如,決策樹就是一種無參數(shù)機器學習算法,非常有彈性并且容易受過擬合訓練數(shù)據(jù)的影響。這種問題可以通過對學習過后的樹進行剪枝來解決,這種方法就是為了移除一些其學習到的細節(jié)。

機器學習中的欠擬合

欠擬合指的是模型在訓練和預(yù)測時表現(xiàn)都不好的情況。欠擬合通常不被討論,因為給定一個評估模型表現(xiàn)的指標的情況下,欠擬合很容易被發(fā)現(xiàn)。矯正方法是繼續(xù)學習并且試著更換機器學習算法。雖然如此,欠擬合與過擬合形成了鮮明的對照。

兩種解決方式:重采樣方法和驗證集方法。

使用重采樣來評價模型效能, 最流行的重采樣技術(shù)是k折交叉驗證。指的是在訓練數(shù)據(jù)的子集上訓練和測試模型k次,同時建立對于機器學習模型在未知數(shù)據(jù)上表現(xiàn)的評估。

驗證集只是訓練數(shù)據(jù)的子集,你把它保留到你進行機器學習算法的最后才使用。在訓練數(shù)據(jù)上選擇和調(diào)諧機器學習算法之后,我們在驗證集上在對于模型進行評估,以便得到一些關(guān)于模型在未知數(shù)據(jù)上的表現(xiàn)的認知。

4. 重采樣和交叉驗證(Cross Validation)

重采樣:

重采樣基于實際數(shù)據(jù)生成一個獨特的采樣分布。它使用經(jīng)驗性方法,而不是分析方法,來生成該采樣分布。重采樣基于數(shù)據(jù)所有可能結(jié)果的無偏樣本獲取無偏估計

交叉驗證:

在使用訓練集對參數(shù)進行訓練的時候,通常會將一整個訓練集分為三個部分訓練集(train_set),評估集(valid_set),測試集(test_set)這三個部分。這其實是為了保證訓練效果而特意設(shè)置的。其中測試集很好理解,其實就是完全不參與訓練的數(shù)據(jù),僅僅用來觀測測試效果的數(shù)據(jù)。在實際的訓練中,訓練的結(jié)果對于訓練集的擬合程度通常還是挺好的(初始條件敏感),但是對于訓練集之外的數(shù)據(jù)的擬合程度通常就不那么令人滿意了。因此我們通常并不會把所有的數(shù)據(jù)集都拿來訓練,而是分出一部分來(這一部分不參加訓練)對訓練集生成的參數(shù)進行測試,相對客觀的判斷這些參數(shù)對訓練集之外的數(shù)據(jù)的符合程度。這種思想就稱為交叉驗證(Cross Validation)

常見的交叉驗證方式:

1)k-folder cross-validation:

k個子集,每個子集均做一次測試集,其余的作為訓練集。交叉驗證重復(fù)k次,每次選擇一個子集作為測試集,并將k次的平均交叉驗證識別正確率作為結(jié)果。

優(yōu)點:所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10-folder通常被使用。

2)K * 2 folder cross-validation

是k-folder cross-validation的一個變體,對每一個folder,都平均分成兩個集合s0,s1,我們先在集合s0訓練用s1測試,然后用s1訓練s0測試。

優(yōu)點是:測試和訓練集都足夠大,每一個個樣本都被作為訓練集和測試集。一般使用k=10

3)least-one-out cross-validation(loocv)

假設(shè)dataset中有n個樣本,那LOOCV也就是n-CV,意思是每個樣本單獨作為一次測試集,剩余n-1個樣本則做為訓練集。

優(yōu)點:

1)每一回合中幾乎所有的樣本皆用于訓練model,因此最接近母體樣本的分布,估測所得的generalization error比較可靠。

2)實驗過程中沒有隨機因素會影響實驗數(shù)據(jù),確保實驗過程是可以被復(fù)制的。

但LOOCV的缺點則是計算成本高,為需要建立的models數(shù)量與總樣本數(shù)量相同,當總樣本數(shù)量相當多時,LOOCV在實作上便有困難,除非每次訓練model的速度很快,或是可以用平行化計算減少計算所需的時間。

5. 模型的評估方法

上式的結(jié)果越接近于1 表明擬合的結(jié)果越好

6. Python 代碼實現(xiàn)

下面以信用卡異常檢測為案例,來鞏固復(fù)習以上知識點。以下代碼整理自屈大神視頻。

導(dǎo)入三大件和數(shù)據(jù)

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

data = pd.read_csv("creditcard.csv")

data.head() # 查看數(shù)據(jù)頭

X =data.loc[:,data.columns != 'Class'] # 特征列

Y =data.loc[:,data.columns == 'Class'] # 標簽列

number_records_fraud = len(data[data.Class==1])# 計算失信人員個數(shù)

# 把索引取出,建立一個數(shù)據(jù)標簽的一維數(shù)組

fraud_indices = np.array(data[data.Class == 1].index) # 異常索引

normal_indices = np.array(data[data.Class != 1].index) # 正常索引

下采樣 Undersample

# 隨機的在正常的數(shù)據(jù)中選擇與異常數(shù)據(jù)個數(shù)相同的正常數(shù)據(jù)點,并建立數(shù)組

random_normal_indices = np.random.choice(normal_indices,

\number_records_fraud,replace=False)

random_normal_indices = np.array(random_normal_indices) # 建立一維數(shù)組

# 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)))

# 劃分數(shù)據(jù)

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)

導(dǎo)入sklearn 相關(guān)庫

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) #原始數(shù)據(jù)集進行訓練

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()

總結(jié)

以上是生活随笔為你收集整理的python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。