一瓜喇、提高模型精度的方法
以下是提高分類模型精度的一些常見方法:
1、數(shù)據(jù)增強(qiáng)
通過對數(shù)據(jù)進(jìn)行旋轉(zhuǎn)歉糜、平移乘寒、縮放等變換,可以生成更多的訓(xùn)練數(shù)據(jù)匪补,從而改善模型泛化能力伞辛。
2、數(shù)據(jù)清洗和預(yù)處理
確保數(shù)據(jù)集中沒有重復(fù)值夯缺、缺失值或無效數(shù)據(jù)蚤氏,并對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化或歸一化失乾,以消除特征之間的差異性戚扳。
3、特征工程
使用相關(guān)性或信息增益等技術(shù)來確定哪些特征可以對分類器產(chǎn)生最大的影響徒役。還可以嘗試使用PCA或LDA等降維算法來減少特征數(shù)量并提高分類器性能捏境。
4于游、模型集成
將多個不同的模型組合起來,可以提高模型性能垫言。例如Bagging贰剥、Boosting、Stacking等筷频。
常見的模型集成方法包括:
Bagging:通過隨機(jī)采樣的方式訓(xùn)練多個模型鸠澈,然后將每個模型的預(yù)測結(jié)果進(jìn)行平均或投票來得到最終的預(yù)測結(jié)果。常見的Bagging方法包括隨機(jī)森林(Random Forest)和Extra Trees截驮。
Boosting:通過逐步調(diào)整樣本權(quán)重笑陈,在每一輪迭代中訓(xùn)練一個新的模型,直到達(dá)到預(yù)定的迭代次數(shù)或者誤差率葵袭。常見的Boosting方法包括* Adaboost涵妥、GBDT和Xgboost等。
Stacking:通過訓(xùn)練多個不同類型的基礎(chǔ)模型坡锡,并將其預(yù)測結(jié)果作為輸入特征訓(xùn)練一個元模型來得到最終的預(yù)測結(jié)果蓬网。
Ensemble Selection:選擇一個最優(yōu)子集窒所,即從所有可能的模型子集中選擇最優(yōu)的子集,以達(dá)到精度更高帆锋、計算時間更短的效果吵取。
Blending:與Stacking類似,但是是將不同類型的基礎(chǔ)模型的預(yù)測結(jié)果按照一定比例進(jìn)行加權(quán)或者平均锯厢,得到最終的預(yù)測結(jié)果皮官。
Bootstrapped Ensembles:與Bagging類似,通過隨機(jī)采樣的方式訓(xùn)練多個模型实辑,并將每個模型的預(yù)測結(jié)果進(jìn)行加權(quán)平均捺氢,以得到最終的預(yù)測結(jié)果。
5剪撬、模型融合
使用多個分類器(如隨機(jī)森林或Bagging)來組合成一個更強(qiáng)大的分類器摄乒。嘗試使用其他類型的分類器,例如支持向量機(jī)(SVM)残黑、神經(jīng)網(wǎng)絡(luò)(NN)或K近鄰算法(KNN)等馍佑。
以下是幾種常見的Python模型融合方法:
- 堆疊
堆疊是一種將多個基本分類器級聯(lián)的技術(shù)。在這個方法中梨水,訓(xùn)練數(shù)據(jù)集被劃分為兩部分:第一部分用于訓(xùn)練多個基本分類器拭荤,第二部分用于對基本分類器進(jìn)行評估和選擇。
在Python中冰木,可以使用scikit-learn庫中的StackingClassifier類來實(shí)現(xiàn)堆疊模型穷劈。
- 投票
投票是一種簡單的模型融合技術(shù)笼恰,在該方法中踊沸,多個獨(dú)立的分類器對同一個樣本進(jìn)行分類,然后按照某種規(guī)則(例如多數(shù)表決)對結(jié)果進(jìn)行匯總社证。
在Python中逼龟,可以使用scikit-learn庫中的VotingClassifier類來實(shí)現(xiàn)投票模型。
- 平均
平均是一種將多個模型的預(yù)測結(jié)果加權(quán)平均的方法追葡。權(quán)重可以是均勻的或者基于模型的性能進(jìn)行設(shè)置腺律,例如在交叉驗(yàn)證中計算的R方或準(zhǔn)確度。
在Python中宜肉,可以使用numpy庫和pandas庫來實(shí)現(xiàn)簡單平均和加權(quán)平均匀钧。
- Boosting
Boosting是一種將弱分類器組合成強(qiáng)分類器的機(jī)器學(xué)習(xí)技術(shù)。在這個方法中谬返,一系列的基本分類器按序逐漸構(gòu)建之斯,并根據(jù)前一步的結(jié)果自適應(yīng)地進(jìn)行權(quán)重調(diào)整。
6遣铝、超參數(shù)調(diào)優(yōu)
通過交叉驗(yàn)證等技術(shù)佑刷,調(diào)整模型超參數(shù)(如學(xué)習(xí)率莉擒、批次大小、網(wǎng)絡(luò)深度等)可以提高模型泛化能力和性能瘫絮≌羌剑可以使用網(wǎng)格搜索、隨機(jī)搜索等技術(shù)進(jìn)行自動化調(diào)優(yōu)(如Hyperopt麦萤、Optuna鹿鳖、GridSearchCV等)。
7频鉴、遷移學(xué)習(xí)
利用已經(jīng)訓(xùn)練好的模型在新的任務(wù)上進(jìn)行微調(diào)栓辜,可以提高模型性能。
8垛孔、優(yōu)化損失函數(shù)
根據(jù)具體場景藕甩,設(shè)計并優(yōu)化分類器的損失函數(shù),以提高分類器性能周荐。
需要注意的是狭莱,不同的數(shù)據(jù)集和任務(wù)可能需要不同的方法來提高分類模型的精度,因此需要根據(jù)實(shí)際情況進(jìn)行選擇和調(diào)整概作。
二腋妙、超參數(shù)調(diào)優(yōu)方法
以下是一些常用的超參數(shù)調(diào)優(yōu)方法:
1、網(wǎng)格搜索(Grid Search)
在給定的超參數(shù)范圍內(nèi)進(jìn)行窮舉搜索讯榕,找到最佳的超參數(shù)組合骤素。可以使用sklearn.model_selection庫中的GridSearchCV函數(shù)實(shí)現(xiàn)愚屁。
2济竹、隨機(jī)搜索(Random Search)
在超參數(shù)空間中隨機(jī)采樣,選擇最優(yōu)的超參數(shù)組合霎槐∷妥牵可以使用sklearn.model_selection庫中的RandomizedSearchCV函數(shù)實(shí)現(xiàn)。
3丘跌、貝葉斯優(yōu)化(Bayesian Optimization)
基于貝葉斯原理袭景,通過不斷地評估模型的結(jié)果,更新模型的先驗(yàn)分布闭树,尋找最優(yōu)的超參數(shù)組合耸棒。可以使用Hyperopt报辱、Optuna等庫實(shí)現(xiàn)与殃。
import hyperopt
from hyperopt import fmin, tpe, hp
# 定義目標(biāo)函數(shù)(實(shí)際應(yīng)用中需要根據(jù)具體問題進(jìn)行替換)
def objective(args):
x, y = args
return x**2 - y**2
# 定義參數(shù)空間
space = [hp.uniform('x', -10, 10),
hp.uniform('y', -10, 10)]
# 使用貝葉斯優(yōu)化算法尋找最佳超參數(shù)組合
best = fmin(fn=objective,
space=space,
algo=tpe.suggest,
max_evals=100)
print(best)
import optuna
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 加載數(shù)據(jù)集
iris = load_iris()
X, y = iris.data, iris.target
# 定義目標(biāo)函數(shù)(實(shí)際應(yīng)用中需要根據(jù)具體問題進(jìn)行替換)
def objective(trial):
# 定義超參數(shù)搜索空間
n_estimators = trial.suggest_int('n_estimators', 10, 1000)
max_depth = trial.suggest_int('max_depth', 2, 32)
min_samples_split = trial.suggest_float('min_samples_split', 0.1, 1.0)
# 定義分類器
clf = RandomForestClassifier(n_estimators=n_estimators,
max_depth=max_depth,
min_samples_split=min_samples_split,
random_state=42)
# 使用10折交叉驗(yàn)證評估模型性能
score = cross_val_score(clf, X, y, cv=10, n_jobs=-1).mean()
return 1.0 - score
# 運(yùn)行貝葉斯優(yōu)化算法,尋找最佳超參數(shù)組合
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)
# 輸出最佳超參數(shù)組合
print(study.best_params)
這個例子使用了Optuna庫來進(jìn)行隨機(jī)森林分類器的超參數(shù)調(diào)優(yōu)。首先奈籽,加載了鳶尾花數(shù)據(jù)集饥侵,并定義了目標(biāo)函數(shù)objective,其中包含了隨機(jī)森林分類器的三個超參數(shù)n_estimators衣屏、max_depth和min_samples_split躏升。然后,使用10折交叉驗(yàn)證評估了模型性能狼忱,并返回了錯誤率(1.0 - 準(zhǔn)確率)作為目標(biāo)函數(shù)的值膨疏。最后,使用Optuna庫的create_study函數(shù)創(chuàng)建一個貝葉斯優(yōu)化器钻弄,并運(yùn)行100次超參數(shù)搜索佃却,輸出最佳超參數(shù)組合。
4窘俺、遺傳算法(Genetic Algorithm)
通過模擬自然遺傳進(jìn)化過程饲帅,選取適應(yīng)度高的個體,生成新的超參數(shù)組合瘤泪,優(yōu)化模型精度灶泵。可以使用DEAP等遺傳算法庫實(shí)現(xiàn)对途。
使用遺傳算法對機(jī)器學(xué)習(xí)模型進(jìn)行參數(shù)調(diào)優(yōu)的庫有以下幾個:
1赦邻、TPOT:這是一個自動機(jī)器學(xué)習(xí)工具,使用遺傳算法對數(shù)據(jù)集進(jìn)行特征選擇和超參數(shù)調(diào)優(yōu)实檀。它能夠在較短的時間內(nèi)找到最佳模型惶洲,并且支持并行化和分布式計算。
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from tpot import TPOTClassifier
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, train_size=0.75, test_size=0.25)
#使用了5代(generations)和50個種群(population_size)膳犹,然后通過fit函數(shù)來訓(xùn)練模型
tpot = TPOTClassifier(generations=5, population_size=50, verbosity=2)
tpot.fit(X_train, y_train)
#TPOT會在搜索完畢后輸出最好的模型恬吕,并將其賦值給best_pipeline屬性,可以打印出來查看
print(tpot.fitted_pipeline_)
#使用export函數(shù)將最佳模型保存到一個Python文件中
tpot.export('tpot_digits_pipeline.py')
2镣奋、scikit-optimize:這是一個用于優(yōu)化超參數(shù)的Python庫币呵,實(shí)現(xiàn)了貝葉斯優(yōu)化怀愧、隨機(jī)搜索和遺傳算法等方法侨颈。它可以應(yīng)用于各種機(jī)器學(xué)習(xí)模型的參數(shù)調(diào)優(yōu)。
3芯义、DEAP:這是一個基于Python的開源遺傳算法框架哈垢。它提供了一系列標(biāo)準(zhǔn)的遺傳算法模板和工具,可以輕松地實(shí)現(xiàn)各種遺傳算法應(yīng)用扛拨。它也可以用于訓(xùn)練各種機(jī)器學(xué)習(xí)模型耘分,包括神經(jīng)網(wǎng)絡(luò)、支持向量機(jī)等。
4求泰、PyGAD:這是一個基于Python的開源遺傳算法庫央渣,可以用于優(yōu)化問題。它提供了多種遺傳算法模型渴频,并且支持并行化和分布式計算芽丹。它可以用于優(yōu)化各種機(jī)器學(xué)習(xí)模型的參數(shù)。
5卜朗、Optunity:這是一個用于超參數(shù)優(yōu)化的Python庫拔第,支持多種優(yōu)化算法,包括遺傳算法场钉。它可以用于優(yōu)化各種機(jī)器學(xué)習(xí)模型的超參數(shù)蚊俺。
Optunity庫支持以下幾種模型調(diào)優(yōu)算法:
Random search:這是一種隨機(jī)搜索算法,它在超參數(shù)空間中隨機(jī)采樣逛万,尋找最優(yōu)的超參數(shù)組合泳猬。
Grid search:這是一種網(wǎng)格搜索算法,它在超參數(shù)空間中均勻地采樣宇植,尋找最優(yōu)的超參數(shù)組合暂殖。Grid search常用于較小的超參數(shù)空間。
Gaussian Process Optimization:這是一種使用高斯過程回歸進(jìn)行貝葉斯優(yōu)化的算法当纱。它利用先前的函數(shù)值推斷下一次采樣點(diǎn)的位置呛每,并且不斷更新高斯過程回歸來逼近最優(yōu)解。該算法對黑盒函數(shù)適用性很強(qiáng)坡氯。
Particle swarm optimization:這是一種基于群體智能的優(yōu)化算法晨横,它將每個超參數(shù)設(shè)置為在空間中的一個粒子,然后搜索最優(yōu)的超參數(shù)組合箫柳。該算法需要指定目標(biāo)函數(shù)手形,而且容易陷入局部最優(yōu)解。
import optunity
import sklearn.svm
#定義目標(biāo)函數(shù)(即要優(yōu)化的模型)悯恍,并將其作為參數(shù)傳遞給Optunity庫中的優(yōu)化器
def compute_accuracy_svm(x_train, y_train, x_test, y_test, C, gamma):
# 定義SVM模型
model = sklearn.svm.SVC(C=C, gamma=gamma)
model.fit(x_train, y_train)
# 計算準(zhǔn)確率
predictions = model.predict(x_test)
accuracy = sklearn.metrics.accuracy_score(y_test, predictions)
return accuracy
# 使用Optunity庫的優(yōu)化器進(jìn)行搜索最優(yōu)超參數(shù)
optimal_pars, _, _ = optunity.minimize(compute_accuracy_svm, num_evals=100, C=[0, 10], gamma=[0, 1], x_train=x_train, y_train=y_train, x_test=x_test, y_test=y_test)
# 打印最優(yōu)超參數(shù)
print('Optimal parameters: C={}, gamma={}'.format(optimal_pars['C'], optimal_pars['gamma']))
# 保存最優(yōu)模型
best_model = sklearn.svm.SVC(C=optimal_pars['C'], gamma=optimal_pars['gamma'])
best_model.fit(x_train, y_train)
import optunity
import optunity.metrics
from sklearn import datasets, svm
# 定義目標(biāo)函數(shù)
def evaluate_svm(C, gamma, data, targets):
# 使用RBF核函數(shù)構(gòu)建SVM分類器
svc = svm.SVC(kernel='rbf', C=C, gamma=gamma)
# 訓(xùn)練模型并計算準(zhǔn)確率
model = svc.fit(data, targets)
predictions = model.predict(data)
return optunity.metrics.accuracy(targets, predictions)
# 加載數(shù)據(jù)集
iris = datasets.load_iris()
data = iris.data
targets = iris.target
# 定義超參數(shù)搜索空間
search_space = {'C': [0, 10], 'gamma': [0, 1]}
# 定義遺傳算法搜索策略和參數(shù)
pop_size = 25
generations = 10
mut_rate = 0.2
# 運(yùn)行遺傳算法搜索
best_hyperparams, best_accuracy, _ = optunity.maximize(evaluate_svm, num_evals=100,
solver_name='ga',
pop_size=pop_size,
generations=generations,
mut_rate=mut_rate,
**search_space)
print('最佳超參數(shù)組合: C={}, gamma={}'.format(best_hyperparams['C'], best_hyperparams['gamma']))
print('對應(yīng)的性能指標(biāo)(準(zhǔn)確率): {:.2%}'.format(best_accuracy))
# 使用最佳超參數(shù)重新訓(xùn)練模型并驗(yàn)證性能
svc = svm.SVC(kernel='rbf', C=best_hyperparams['C'], gamma=best_hyperparams['gamma'])
model = svc.fit(data, targets)
predictions = model.predict(data)
accuracy = optunity.metrics.accuracy(targets, predictions)
print('使用最佳超參數(shù)重新訓(xùn)練的模型在整個數(shù)據(jù)集上的性能指標(biāo)(準(zhǔn)確率): {:.2%}'.format(accuracy))
三库糠、特征工程
一些常見的特征工程方法包括:
數(shù)據(jù)清洗
- 處理缺失值:使用插值方法填充丟失的值或者刪除存在缺失值的行/列。
- 處理異常值:使用統(tǒng)計方法或其他技術(shù)檢測和處理異常值涮毫。
- 處理重復(fù)值:檢測并刪除重復(fù)樣本或特征瞬欧。
特征選擇
- 通過相關(guān)性分析或統(tǒng)計方法選取具有代表性的特征。
- 使用基于樹的算法(如隨機(jī)森林)或逐步回歸等貪心算法進(jìn)行特征選擇罢防。
- 利用正則化(L1/L2正則化)去除權(quán)重較小的特征艘虎。
以下是幾種常見的Python特征選擇方法:
1、方差選擇法
方差選擇法是基于特征方差的統(tǒng)計分析方法咒吐。該方法假定特征的方差與它們的重要性有關(guān)野建,因此刪除方差很小的特征可以減少噪聲属划,并提高機(jī)器學(xué)習(xí)算法的性能。
在Python中候生,可以使用VarianceThreshold類從數(shù)據(jù)集中刪除低方差的特征同眯。
2、相關(guān)性分析
相關(guān)性分析是一種通過計算不同特征之間的相關(guān)系數(shù)來確定特征之間關(guān)聯(lián)程度的方法唯鸭。如果兩個特征高度相關(guān)嗽测,則其中一個特征可能不是必要的,因?yàn)樗峁┑男畔⒖梢杂闪硪粋€特征提供肿孵。
在Python中唠粥,可以使用pandas庫中的corr()函數(shù)或scikit-learn庫中的SelectKBest類中的pearson卡方檢驗(yàn)或互信息來進(jìn)行相關(guān)性分析。
3停做、基于樹的方法
基于樹的算法(如決策樹和隨機(jī)森林)可以計算每個特征對模型的貢獻(xiàn)晤愧,然后將不重要的特征剪枝掉。這些算法還可以返回特征的相對重要性排名蛉腌。
在Python中官份,可以使用scikit-learn庫中的DecisionTreeClassifier類和RandomForestClassifier類來計算特征重要性和選擇重要特征。
4烙丛、基于L1正則化的方法
基于L1正則化的方法通過最小化帶有L1懲罰項(xiàng)的損失函數(shù)來選擇特征舅巷。這種方法將不相關(guān)或弱相關(guān)的特征的系數(shù)壓縮為零,并保留與目標(biāo)變量高度相關(guān)的特征河咽。
在Python中钠右,可以使用scikit-learn庫中的Lasso或ElasticNet回歸模型來進(jìn)行L1正則化。
總之忘蟹,在Python中飒房,可以使用上述方法之一或其組合來選擇最佳特征,以提高機(jī)器學(xué)習(xí)算法的性能媚值。
特征轉(zhuǎn)換
- 標(biāo)準(zhǔn)化/歸一化:將特征縮放到相似的范圍內(nèi)狠毯,例如使用z-score標(biāo)準(zhǔn)化或Min-Max縮放等方法。
- 離散化:將連續(xù)數(shù)據(jù)劃分為離散值褥芒,例如使用等頻率離散化或等寬度離散化等方法嚼松。
- 對數(shù)轉(zhuǎn)換:可以使用對數(shù)函數(shù)對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,使其更符合正態(tài)分布锰扶。
- 主成分分析(PCA):利用線性代數(shù)方法將高維數(shù)據(jù)轉(zhuǎn)換為低維數(shù)據(jù)献酗,同時保留盡可能多的信息。
- 特征交互:通過對不同特征進(jìn)行組合和交互來創(chuàng)建新的特征少辣。
Python中常用的特征變換方法包括:
1凌摄、標(biāo)準(zhǔn)化(Standardization):將數(shù)據(jù)按照均值為0羡蛾,標(biāo)準(zhǔn)差為1進(jìn)行縮放漓帅,使得不同屬性之間可以進(jìn)行有意義的比較。
2、正則化(Normalization):將數(shù)據(jù)按照最大值和最小值進(jìn)行縮放忙干,使得數(shù)據(jù)落在[0,1]的范圍內(nèi)器予。
3、對數(shù)變換(Log Transformation):將數(shù)據(jù)進(jìn)行對數(shù)變換捐迫,可以使得數(shù)據(jù)更加符合正態(tài)分布乾翔,適用于偏態(tài)分布的數(shù)據(jù)。
4施戴、Box-Cox變換:是一種將數(shù)據(jù)進(jìn)行冪轉(zhuǎn)換的方法反浓,可以將非正態(tài)分布的數(shù)據(jù)轉(zhuǎn)換成正態(tài)分布的數(shù)據(jù)。
5赞哗、特征組合(Feature Combination):將兩個或多個特征組合起來生成新的特征雷则,可以增加模型的預(yù)測能力。
Python中常用的特征組合方法包括:
交叉特征(Cross Feature):將兩個或多個特征組合起來生成新的特征肪笋,例如將性別和年齡進(jìn)行交叉月劈,則可以得到“男性-20歲”、“女性-30歲”等特征藤乙。
多項(xiàng)式特征(Polynomial Feature):將原始特征按照冪次的方式擴(kuò)展猜揪,得到新的特征。例如坛梁,對于一維特征x而姐,可以生成x2、x3等高階項(xiàng)划咐。
N-gram特征(N-gram Feature):在文本分類等任務(wù)中毅人,可以將相鄰的n個單詞或字符組合成一個新的特征。
聚類特征(Clustering Feature):使用聚類算法對數(shù)據(jù)進(jìn)行分組尖殃,然后將不同組之間的距離作為新的特征丈莺。
頻率特征(Frequency Feature):對于文本分類等任務(wù),可以統(tǒng)計關(guān)鍵詞出現(xiàn)的頻率并將其作為新的特征送丰。
統(tǒng)計特征(Statistical Feature):對于數(shù)值型數(shù)據(jù)缔俄,可以統(tǒng)計其均值、方差器躏、最大值俐载、最小值等統(tǒng)計量,并將其作為新的特征登失。
6遏佣、特征分解(Feature Decomposition):通過矩陣分解等方法,將原始特征轉(zhuǎn)換為新的特征揽浙,提高模型的預(yù)測準(zhǔn)確率状婶。
7意敛、卡方檢驗(yàn)(Chi-Squared Test):對分類問題中的特征進(jìn)行卡方檢驗(yàn),篩選出與目標(biāo)變量相關(guān)性最高的特征膛虫。
特征降維
- 利用PCA等技術(shù)將高維特征空間映射到低維特征空間草姻,從而減少計算復(fù)雜度和存儲成本。
- 基于模型的特征選擇:使用基于模型的方法稍刀,例如Lasso回歸或決策樹等撩独,自動選擇最具有代表性的特征。
總之账月,特征工程是機(jī)器學(xué)習(xí)流程中至關(guān)重要的一步综膀。在Python中,可以使用各種庫和工具來實(shí)現(xiàn)這些特征工程方法局齿,例如pandas僧须、numpy、scikit-learn项炼、statsmodels等担平。
Python中常用的特征降維方法包括:主成分分析(PCA)、線性判別分析(LDA)锭部、特征選擇(Feature Selection)暂论、因子分析(Factor Analysis)、獨(dú)立成分分析(ICA)以及淺層神經(jīng)網(wǎng)絡(luò)(Shallow Neural Networks)等拌禾。
四取胎、模型評估
1、分類模型的模型評估方法
準(zhǔn)確率(Accuracy):它是分類正確的樣本數(shù)與總樣本數(shù)之比湃窍。
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_true, y_pred)
精確率(Precision):它是分類器預(yù)測出的正樣本中有多少是真正的正樣本闻蛀。
from sklearn.metrics import precision_score
precision = precision_score(y_true, y_pred, average='macro')
召回率(Recall):分類器能夠識別出多少個真實(shí)的正樣本。
from sklearn.metrics import recall_score
recall = recall_score(y_true, y_pred, average='macro')
F1得分(F1-score):綜合了精確率和召回率的度量您市。
from sklearn.metrics import f1_score
f1 = f1_score(y_true, y_pred, average='macro')
AUC-ROC曲線:AUC-ROC曲線可以度量二分類問題中分類器的性能觉痛。ROC(接收操作特征)曲線將真陽性率(TPR)作為橫軸,假陽性率(FPR)作為縱軸茵休。AUC(曲線下面積)越接近1薪棒,表示分類器的性能越好。
from sklearn.metrics import roc_auc_score, roc_curve
roc_auc = roc_auc_score(y_true, y_pred_probabilities)
fpr, tpr, thresholds = roc_curve(y_true, y_pred_probabilities)
2榕莺、回歸模型的模型評估方法
均方誤差(MSE):是預(yù)測值與真實(shí)值之間差異的平方和的平均值俐芯。
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true, y_pred)
平均絕對誤差(MAE):是預(yù)測值與真實(shí)值之間差異的絕對值的平均值。
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true, y_pred)
決定系數(shù)(R2):用于衡量預(yù)測結(jié)果與真實(shí)結(jié)果的相關(guān)性钉鸯,其值介于0和1之間吧史,越接近1表示模型的擬合效果越好。
from sklearn.metrics import r2_score
r2 = r2_score(y_true, y_pred)
可解釋方差值(explained variance score):度量了模型能夠解釋數(shù)據(jù)方差的比例唠雕。
from sklearn.metrics import explained_variance_score
evs = explained_variance_score(y_true, y_pred)
五贸营、損失函數(shù)
1吨述、分類器的損失函數(shù)
以下是幾個設(shè)計并優(yōu)化分類器損失函數(shù)的方法:
交叉熵?fù)p失函數(shù)(Cross-Entropy Loss):在二分類問題中,可以使用二元交叉熵?fù)p失函數(shù)莽使,而在多分類問題中锐极,可以使用多元交叉熵?fù)p失函數(shù)笙僚。它們是常用的分類器損失函數(shù)之一芳肌,通過最小化交叉熵?fù)p失函數(shù)來訓(xùn)練分類器,可以提高分類器的性能肋层。
加權(quán)損失函數(shù)(Weighted Loss):如果數(shù)據(jù)集中存在類別不平衡的情況亿笤,即某些類別的樣本數(shù)量遠(yuǎn)遠(yuǎn)超過其他類別的樣本數(shù)量,那么可以通過加權(quán)損失函數(shù)來平衡不同類別之間的貢獻(xiàn)栋猖。
Focal Loss:Focal Loss是一種針對類別不平衡問題的損失函數(shù)净薛,通過調(diào)整難易樣本的權(quán)重,降低易分類樣本的權(quán)重蒲拉,提高難分類樣本的權(quán)重肃拜,從而提高分類器在難度較大的樣本上的性能。
Margin Loss:Margin Loss是一種針對分類器邊界問題的損失函數(shù)雌团,它通過增加類別之間的間隔來提高分類器性能燃领,從而使分類器更具魯棒性。
在設(shè)計和優(yōu)化分類器損失函數(shù)時锦援,需要根據(jù)特定問題和數(shù)據(jù)集選擇適合的損失函數(shù)猛蔽,并結(jié)合交叉驗(yàn)證等方法進(jìn)行模型調(diào)優(yōu),以達(dá)到最佳的分類器性能灵寺。
2曼库、回歸器的損失函數(shù)
以下是幾個設(shè)計并優(yōu)化回歸器損失函數(shù)的方法:
均方誤差(MSE):均方誤差是最常見的回歸損失函數(shù),它計算預(yù)測值與實(shí)際值之間的平方差的平均值略板。通過最小化均方誤差來訓(xùn)練回歸器毁枯,可以提高回歸器的性能。
平均絕對誤差(MAE):平均絕對誤差是預(yù)測值與實(shí)際值之間的絕對值的平均值叮称。相比于MSE后众,它對異常值更加魯棒。
Huber 損失函數(shù):Huber 損失函數(shù)是一種介于 MSE 和 MAE 之間的損失函數(shù)颅拦,它對異常值不敏感蒂誉。當(dāng)殘差的絕對值小于某個值 delta 時,采用平方誤差距帅;反之右锨,則采用絕對誤差。
分位數(shù)回歸損失函數(shù):分位數(shù)回歸通過學(xué)習(xí)不同分位數(shù)處的條件中位數(shù)碌秸,來進(jìn)行回歸問題的解決绍移。對于一個 alpha 分位數(shù)回歸悄窃,其損失函數(shù)可以表示為:
其中,y 是真實(shí)值蹂窖,f(x) 是預(yù)測值轧抗,tau 表示分位數(shù)。
在設(shè)計和優(yōu)化回歸器損失函數(shù)時瞬测,需要根據(jù)特定的問題和數(shù)據(jù)集選擇適合的損失函數(shù)横媚,并結(jié)合交叉驗(yàn)證等方法進(jìn)行模型調(diào)優(yōu),以達(dá)到最佳的回歸器性能月趟。
六灯蝴、遷移學(xué)習(xí)
在表格數(shù)據(jù)中實(shí)現(xiàn)遷移學(xué)習(xí),可以使用以下方法:
1孝宗、使用預(yù)訓(xùn)練的特征提取器:在表格數(shù)據(jù)中穷躁,特征通常是結(jié)構(gòu)化的,因此我們可以使用已經(jīng)訓(xùn)練好的特征提取器因妇,如VGG问潭、ResNet等,將其作為一個特征提取器婚被,在新的任務(wù)中進(jìn)行微調(diào)狡忙。
from tensorflow.keras.applications import VGG16
# 加載模型,不包括分類器頭部
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 凍結(jié)基模型摔寨,只訓(xùn)練自定義頭部
for layer in base_model.layers:
layer.trainable = False
# 取出特征提取器
feature_extractor = Model(inputs=base_model.input, outputs=base_model.output)
# 將表格數(shù)據(jù)輸入到特征提取器中去枷,獲取特征向量
features = feature_extractor.predict(table_data)
import torch
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import torchvision.models as models
import torch.nn as nn
import torch.optim as optim
# 定義超參數(shù)
num_classes = 10
learning_rate = 0.001
num_epochs = 10
batch_size = 32
# 加載訓(xùn)練集和驗(yàn)證集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
val_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
# 加載已經(jīng)在ImageNet上訓(xùn)練好的ResNet-50模型
model = models.resnet50(pretrained=True)
# 凍結(jié)所有預(yù)訓(xùn)練模型層
for param in model.parameters():
param.requires_grad = False
# 添加新層
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, num_classes)
# 定義新模型
transfer_model = model
# 定義損失函數(shù)和優(yōu)化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(transfer_model.parameters(), lr=learning_rate)
# 訓(xùn)練模型
for epoch in range(num_epochs):
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = transfer_model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 計算在驗(yàn)證集上的準(zhǔn)確率
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in val_loader:
outputs = transfer_model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print('Epoch [{}/{}], Accuracy: {:.2f}%'.format(epoch+1, num_epochs, accuracy))
2、使用遷移學(xué)習(xí)框架:除了使用預(yù)訓(xùn)練的特征提取器外是复,還可以使用遷移學(xué)習(xí)框架對表格數(shù)據(jù)進(jìn)行遷移學(xué)習(xí)删顶。一些常用的遷移學(xué)習(xí)框架包括MAML、FOMAML淑廊、ProtoNets等逗余。
import torch
from torch import nn, optim
from torch.utils.data import DataLoader
from learn2learn.algorithms import MAML
from learn2learn.data import TaskDataset
from learn2learn.data.transforms import (NWays,
KShots,
LoadData,
RemapLabels,
ConsecutiveLabels)
from learn2learn.utils import accuracy
# 定義數(shù)據(jù)集
dataset = TaskDataset(table_data, num_tasks=10, transform=
[NWays(dataset.num_classes),
KShots(k=5),
LoadData(dataset),
RemapLabels(),
ConsecutiveLabels()])
# 定義模型和優(yōu)化器
model = nn.Linear(in_features=dataset.input_size, out_features=dataset.output_size)
maml = MAML(model=model, lr=0.01, first_order=False)
opt = optim.SGD(maml.parameters(), lr=0.1)
# 進(jìn)行遷移學(xué)習(xí)
for iteration in range(100):
learner = maml.clone()
task = dataset.sample_task()
support_data, support_labels = task['train']
query_data, query_labels = task['test']
# 在任務(wù)上進(jìn)行訓(xùn)練,并更新參數(shù)
for i in range(10):
pred = learner(support_data)
loss = nn.functional.cross_entropy(pred, support_labels)
learner.adapt(loss)
# 在測試集上計算準(zhǔn)確率
with torch.no_grad():
pred = learner(query_data)
acc = accuracy(pred, query_labels)
# 更新梯度并打印結(jié)果
opt.zero_grad()
acc.backward()
opt.step()
print(f'Iteration {iteration}: {acc.item()}')
這些方法可以幫助我們在表格數(shù)據(jù)中應(yīng)用遷移學(xué)習(xí)季惩,快速實(shí)現(xiàn)高性能模型录粱。