溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中如何理解算法的度量

發(fā)布時(shí)間:2021-10-12 10:00:43 來源:億速云 閱讀:113 作者:柒染 欄目:云計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)python中如何理解算法的度量,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1 機(jī)器學(xué)習(xí)算法性能度量

這里要評(píng)估一下這個(gè)算法到底效果如何。 評(píng)價(jià)的度量是有很多種的, 不同的場(chǎng)景使用的度量也不盡相同。 詳情如下。

1.1 算法評(píng)估度量

首先這些都是監(jiān)督學(xué)習(xí), 也就是說都是有標(biāo)記的數(shù)據(jù)。 而如何度量和評(píng)價(jià)機(jī)器學(xué)習(xí)算法呢, 還是要分成分類和回歸兩種問題分別來討論。

  • 對(duì)于分類, 我們用Pima Indians onset of diabetes dataset。 算法呢用的是邏輯回歸。 注意邏輯回歸并不是回歸算法而是分類算法。 使用了一個(gè)sigmond的函數(shù)做了處理, 結(jié)果在0和1 之間。

  • 對(duì)于回歸, 用的是波士頓房?jī)r(jià)的數(shù)據(jù)集。 算法呢, 就是以線性回歸為例。

1.2 分類的度量

對(duì)于分類問題, 有很多的度量都可以來評(píng)價(jià)這個(gè)算法的好壞, 但是側(cè)重點(diǎn)略有不同。 以下分別討論。

  • Classification Accuracy. 分類準(zhǔn)確性

  • Logarithmic Loss. 對(duì)數(shù)損失函數(shù)

  • Area Under ROC Curve. ROC, AUC

  • Confusion Matrix.混淆矩陣

  • Classication Report. 分類報(bào)表

1.2.1 Classification Accuracy 分類準(zhǔn)確性

分類準(zhǔn)確性是正確預(yù)測(cè)的數(shù)量占蘇哦有預(yù)測(cè)的比例。 最常規(guī)的參數(shù), 也是最沒用的? 因?yàn)樗皇沁m用于各種分類相同數(shù)量的情況, 而這并不常見。 評(píng)價(jià)的過于單一。 詳細(xì)的例子略。

比如下面說的:

  • accuracy是最常見也是最基本的evaluation metric。但在binary classification 且正反例不平衡的情況下,尤其是我們對(duì)minority class 更感興趣的時(shí)候,accuracy評(píng)價(jià)基本沒有參考價(jià)值。

  • 什么fraud detection(欺詐檢測(cè)),癌癥檢測(cè),都符合這種情況。舉個(gè)栗子:在測(cè)試集里,有100個(gè)sample,99個(gè)反例,只有1個(gè)正例。如果我的模型不分青紅皂白對(duì)任意一個(gè)sample都預(yù)測(cè)是反例,那么我的模型的accuracy是 正確的個(gè)數(shù)/總個(gè)數(shù) = 99/100 = 99%你拿著這個(gè)accuracy高達(dá)99%的模型屁顛兒屁顛兒的去預(yù)測(cè)新sample了,而它一個(gè)正例都分不出來,有意思么。。。也有人管這叫accuracy paradox。

用的不多, 僅作了解。

1.2.2 對(duì)數(shù)損失函數(shù)

對(duì)數(shù)損失函數(shù)也是一種評(píng)估預(yù)測(cè)準(zhǔn)確性的方式, 變量的值在0-1之間。 看了一些例子, 經(jīng)常用來判斷邏輯回歸的性能。 例子如下。

# Cross Validation Classification LogLoss
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression()
scoring = 'neg_log_loss'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("Logloss: %.3f (%.3f)") % (results.mean(), results.std())

# Logloss: -0.493 (0.047)

不理解為什么是負(fù)的, 所以簡(jiǎn)單查了一些。 有人說負(fù)的是有問題的。 而值如果接近于是0 是更好的選擇。 https://stackoverflow.com/questions/21443865/scikit-learn-cross-validation-negative-values-with-mean-squared-error Yes, this is supposed to happen. The actual MSE is simply the positive version of the number you're getting.

https://stackoverflow.com/questions/21050110/sklearn-gridsearchcv-with-pipeline

Those scores are negative MSE scores, i.e. negate them and you get the MSE. The thing is that GridSearchCV, by convention, always tries to maximize its score so loss functions like MSE have to be negated.

MSE(均方差、方差):Mean squared error 這個(gè)再理解以下吧, 也許象有人說的, 其實(shí)是有些問題的。

1.2.3 AUC - area under ROC curve

ROC(receiver operating characteristic curve)是曲線, 比如以下。 python中如何理解算法的度量

在ROC空間,ROC曲線越凸向左上方向效果越好。

AUC 是啥意思呢就是下面的面積。 那么聰明的你一定想得到,ROC曲線下方所包圍的面積越大,那么分類器的性能越優(yōu)越。這個(gè)曲線下的面積,就叫做AUC(Area Under the Curve)。因?yàn)檎麄€(gè)正方形的面積為1,所以0<=AUC<=1。

# Cross Validation Classification ROC AUC
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression()
scoring = 'roc_auc'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("AUC: %.3f (%.3f)") % (results.mean(), results.std())

# AUC: 0.824 (0.041)

1.2.4 Confusion Matrix 混淆矩陣

混淆矩陣可以度量二分類,以及多分類問題。 這個(gè)對(duì)多分類的處理是它的優(yōu)點(diǎn)。 考慮到自己方向和時(shí)間的問題, 沒有做進(jìn)一步的探討, 只是把代碼運(yùn)行了以下。

# Cross Validation Classification Confusion Matrix
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33

seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,
random_state=seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
matrix = confusion_matrix(Y_test, predicted)
print(matrix)
[[141  21]
 [ 41  51]]

1.2.5 分類的報(bào)表

這個(gè)其實(shí)才是最常用的。 應(yīng)該理解清楚才行。

precision, recall, F1-score and support for each class

  • 精確率

  • 召回率

  • F1

下面是之前摘抄的一段, 應(yīng)該是知乎的解釋, 應(yīng)該比較清楚

關(guān)于準(zhǔn)確率 來個(gè)例子 現(xiàn)在我先假定一個(gè)具體場(chǎng)景作為例子。 假如某個(gè)班級(jí)有男生80人,女生20人,共計(jì)100人.目標(biāo)是找出所有女生. 現(xiàn)在某人挑選出50個(gè)人,其中20人是女生,另外還錯(cuò)誤的把30個(gè)男生也當(dāng)作女生挑選出來了. 作為評(píng)估者的你需要來評(píng)估(evaluation)下他的工作

首先我們可以計(jì)算準(zhǔn)確率(accuracy),其定義是: 對(duì)于給定的測(cè)試數(shù)據(jù)集,分類器正確分類的樣本數(shù)與總樣本數(shù)之比。也就是損失函數(shù)是0-1損失時(shí)測(cè)試數(shù)據(jù)集上的準(zhǔn)確率[1].

  • 很容易,我們可以得到:他把其中70(20女+50男)人判定正確了,而總?cè)藬?shù)是100人,所以它的accuracy就是70 %(70 / 100). 這個(gè)值在一些時(shí)候是有意義的,但是很多情況準(zhǔn)確率高并不意味著這個(gè)算法就好。 比如說1千萬頁面, google 選擇孫楊相關(guān)得, 實(shí)際一共是100頁面。 在這種情況下, 算法是永遠(yuǎn)返回錯(cuò)誤, 那么正確率是 100/10000000 高達(dá)99.999% 但是實(shí)際上是沒有意義得。 比如引入新得判斷標(biāo)準(zhǔn)。

    header 1 |相關(guān), 正類 | Nonrelevant 負(fù)類 ---|--- | --- 被檢索到 判斷成正確得 | TUre positives TP 正類判斷為正類, 例子中就是說正確得認(rèn)為女生是女生 | False positive FP 就是說負(fù)類判斷錯(cuò)誤了,成了正類。例子中男生被判斷成了女生。 未被檢索到 判斷成錯(cuò)誤得 | falsenegatives FN 正類被判斷成了負(fù)類。 女生被判斷錯(cuò)誤成了男生。 | true negatives TN 男生是男生, 正確判斷, 負(fù)類是負(fù)類。

  • TP FP 都是判斷成了正確得, 其實(shí)TP 是對(duì)得, FP 是錯(cuò)誤判斷。

  • FN TN 都判斷成了負(fù)類, FN 判斷錯(cuò)了, TN 是判斷對(duì)了。

  • TP FN 都是正類, TP 判斷成了正類, FN 判斷成了負(fù)類, 是錯(cuò)得。

  • FP TN 都是男生, FP 判斷錯(cuò)了成了女生。 TN 就是判斷正確是男生。 首先 TP-20, FP-30 FN 0 TN 50 精確率T 就是 TP/(TP+FP)= 20/(20+30) 所有正確被檢索得占實(shí)際被檢索到得比例。 召回率R, TP/(TP+FN)所有被檢索得占應(yīng)該檢索得。 20/(20+0) 100% 不是說要召回, 而是說應(yīng)該檢索得里面多少正確得檢索了。 F1值是精確率和召回率得調(diào)和均值。

python中如何理解算法的度量

python中如何理解算法的度量

F1-measure 認(rèn)為精確率和召回率的權(quán)重是一樣的

# Cross Validation Classification Report
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size,
random_state=seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
report = classification_report(Y_test, predicted)
print(report)
       precision    recall  f1-score   support

        0.0       0.77      0.87      0.82       162
        1.0       0.71      0.55      0.62        92

avg / total       0.75      0.76      0.75       254

1.3 回歸算法的度量

這里關(guān)于回歸算法的度量, 三種:

  • Mean Absolute Error MAE 平均絕對(duì)誤差是絕對(duì)誤差的平均值

  • Mean Squared Error MSE 均方誤差是指參數(shù)估計(jì)值與參數(shù)真值之差平方的期望值;

  • R2

1.3.1 Mean Absolute Error 平均絕對(duì)誤差

這個(gè)用的是絕對(duì)值 python中如何理解算法的度量

# Cross Validation Regression MAE
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
filename = 'housing.csv'
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO',
'B', 'LSTAT', 'MEDV']
dataframe = read_csv(filename, delim_whitespace=False, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
kfold = KFold(n_splits=10, random_state=7)
model = LinearRegression()
scoring = 'neg_mean_absolute_error'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("MAE: %.3f (%.3f)") % (results.mean(), results.std())

# MAE: -4.005 (2.084)

插播 -- 其實(shí)在調(diào)試過程 遇到了個(gè)問題 “invalid literal for float():xx” 愿意你是什么呢, 是因?yàn)樵趯?dǎo)入數(shù)據(jù)的時(shí)候沒有設(shè)置正確的分割符。

dataframe = read_csv(filename, delim_whitespace=True, names=names)

--》

dataframe = read_csv(filename, delim_whitespace=False, names=names)

如果遇到這種問題不知道如何解決怎么辦, 把數(shù)據(jù)打印出來看看就會(huì)有思路的。

1.3.2 Mean Squared Error 平均均方誤差

python中如何理解算法的度量

這個(gè)應(yīng)用應(yīng)該是最廣的,因?yàn)樗軌蚯髮?dǎo),所以經(jīng)常作為loss function。計(jì)算的結(jié)果就是你的預(yù)測(cè)值和真實(shí)值的差距的平方和。

# Cross Validation Regression MSE
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
filename = 'housing.csv'
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO',
'B', 'LSTAT', 'MEDV']
dataframe = read_csv(filename, delim_whitespace=False, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
num_folds = 10
kfold = KFold(n_splits=10, random_state=7)
model = LinearRegression()
scoring = 'neg_mean_squared_error'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("MSE: %.3f (%.3f)") % (results.mean(), results.std())

# MSE: -34.705 (45.574)

1.3.3 R2 度量

python中如何理解算法的度量

就是說每個(gè)值和與預(yù)測(cè)值的差的平方和除以每個(gè)值和平均值的差的平方和。 最后用1減以下, 如果大小接近1 就是很好的。

# Cross Validation Regression R^2
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
filename = 'housing.csv'
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO',
'B', 'LSTAT', 'MEDV']
dataframe = read_csv(filename, delim_whitespace=False, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
kfold = KFold(n_splits=10, random_state=7)
model = LinearRegression()
scoring = 'r2'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("R^2: %.3f (%.3f)") % (results.mean(), results.std())

# R^2: 0.203 (0.595)

1.4 小結(jié)

比較 首先從公式也能看出來,這三個(gè)基本上是R^2算一類,然后MSE和MAE算另一類。為什么呢?因?yàn)镽^2相當(dāng)于是對(duì)所有的數(shù)據(jù)都會(huì)有一個(gè)相同的比較標(biāo)準(zhǔn)。也就是說你得到一個(gè)值0.9999,那就非常好(當(dāng)然對(duì)不同的應(yīng)用你對(duì)好的定義可能會(huì)不一樣,比如某些你覺得0.6就夠了,某些你要0.8)。而MAE和MSE就是數(shù)據(jù)相關(guān)了,范圍可以非常大,你單純根據(jù)一個(gè)值完全不知道效果怎么樣。就是說R2 的值是0-1, 然后呢另外兩個(gè)是不同的, 范圍可能很大。

上述就是小編為大家分享的python中如何理解算法的度量了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI