English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
机器学习中的预测问题通常分为2类:回归与分类。
简单的说回归就是预测数值,而分类是给数据打上标签归类。
本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。
本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。
拟合的目的是使根据训练数据能够拟合出一个多项式函数,这个函数能够很好地拟合现有数据,并且能对未知的数据进行预测。
代码如下:
import matplotlib.pyplot as plt import numpy as np import scipy as sp from scipy.stats import norm from sklearn.pipeline import Pipeline from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn import linear_model ''''' Geração de dados ''' x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + x**2 ''''' Raiz quadrada do erro quadrático médio ''' def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) ''''' Excelência em comparação com a média, entre [0~1]. 0 representa pior que a média.1representa uma predição perfeita. Esta implementação é referência do scikit-doc.official learn ''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() ''''' Esta é a versão de Conway & White no livro 'Análise de Casos de Uso de Aprendizado de Máquina' ''' def R22(y_test, y_true): y_mean = np.array(y_true) y_mean[:] = y_mean.mean() return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true) plt.scatter(x, y, s=5) degree = [1,2,100] y_test = [] y_test = np.array(y_test) for d in degree: clf = Pipeline([('poly', PolynomialFeatures(degree=d)), ('linear', LinearRegression(fit_intercept=False))]) clf.fit(x[:, np.newaxis], y) y_test = clf.predict(x[:, np.newaxis]) print(clf.named_steps['linear'].coef_) print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' % (rmse(y_test, y), R2(y_test, y), R22(y_test, y), clf.score(x[:, np.newaxis], y))) plt.plot(x, y_test, linewidth=2) plt.grid() plt.legend(['1','2','10plt.title('0'], loc='upper left') plt.show()
O resultado de execução do programa é o seguinte:
[-0.16140183 0.99268453]
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82
[ 0.00934527 -0.03591245 1.03065829]
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[ 6.07130354e-02 -1.02247150e+00 6.66972089e+01 -1.85696012e+04
......
-9.43408707e+12 -9.78954604e+12 -9.99872105e+12 -1.00742526e+13
-1.00303296e+13 -9.88198843e+12 -9.64452002e+12 -9.33298267e+12
-1.00580760e+12]
rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89
O coeficiente mostrado é o parâmetro polinomial. Por exemplo1o resultado do ajuste é
y = 0.99268453x -0.16140183
Aqui devemos prestar atenção a alguns pontos:
1análise de erro.
faz análise de regressão, erros comuns incluem a raiz quadrada do erro quadrado médio (RMSE) e R-de erro2análise de erro.
quadrado (RRMSE
R2é a raiz quadrada média do erro quadrado entre a previsão e o valor real. Este método de medida é muito popular (método de avaliação da competição de aprendizado de máquina do Netflix), é um método de ponderação quantitativa.1é o método de comparar a previsão com a média simplesmente usada para ver quão boa é. O intervalo geralmente está em (0,1representa o caso em que todas as previsões correspondem perfeitamente aos resultados reais. 0 representa que é melhor não prever nada, simplesmente pegar a média, enquanto
R2os métodos de cálculo variam levemente entre diferentes literaturas. Como a função R2é com base no método de cálculo do scikit-learn, que é consistente com o resultado da função clf.score.
e a implementação da documentação do R22A implementação da função foi adaptada do livro de Conway "Análise de Casos de Aprendizado de Máquina", diferindo daquele que ele usou2a relação entre o RMSE2.
vemos que o número de graus do polinômio é1Embora o ajuste não seja muito bom, R2também pode alcançar 0.82.2o grau do polinômio é aumentado para 0.88. Quando o grau é aumentado para100 vezes, R2só foi aumentado para 0.89.
2e sobreajuste.
usando100 grau do polinômio faz ajuste, o efeito é maior, mas a capacidade de teste do modelo é extremamente ruim.
E note que os coeficientes polinomiais, muitos valores grandes, até10do12o grau.
Aqui alteramos o código, ajustando500 amostras, o último2amostras foram removidas do conjunto de treinamento. No entanto, ainda testamos todos os500 amostras.
clf.fit(x[:498, np.newaxis], y[:498]
Os resultados do ajuste polinomial modificado são os seguintes:
[-0.17933531 1.0052037 ]
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935 0.01922011 0.99193521]
rmse=0.10, R2=0.9, R22=0.69, clf.score=0.90
...
rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57
só falta o último2amostras de treinamento, linha vermelha (10O ajuste de 0 grau do polinômio gerou uma forte desvio na predição, R2caiu abruptamente para 0.57.
e olhando de forma inversa1,2os resultados do ajuste de grau do polinômio, R2ao contrário, subiu ligeiramente.
Isso mostra que polinômios de grau alto sobreajustam os dados de treinamento, incluindo uma grande quantidade de ruído, resultando em completa perda da capacidade de predição da tendência dos dados. Anteriormente também vimos que10O ajuste de 0 grau do polinômio gera coeficientes numéricos absurdamente grandes. Naturalmente, pensamos em limitar o tamanho desses coeficientes durante o processo de ajuste para evitar a geração dessa função de ajuste anormal.
Seu princípio básico é a soma dos valores absolutos de todos os coeficientes do polinômio ajustado (L2 norm)1O regulamento ou a soma dos quadrados (L2 norm)2O regulamento é adicionado ao modelo de penalidade, e um fator de penalidade w é especificado para evitar a geração desses coeficientes anormais.
Esta ideia foi aplicada no método de regressão Ridge (usando Ridge Regression)2正则化)、Lasso法(使用L1regularização), rede elástica (Elastic net, usando L1 regularização), Lasso (usando L2 regularização).1+L2Métodos como regularização (L1 regularização), rede elástica (Elastic net, usando L1 regularização), Lasso (usando L2 regularização) podem evitar eficazmente o overfitting. Mais detalhes podem ser encontrados em materiais relevantes.
Vamos ver um exemplo de Ridge Regression:100 polinômio de grau ajuste é eficaz. Modifique o código conforme a seguir:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400]
Os resultados são os seguintes:
[ 0. 0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0. 0.35936882 0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01
1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11]
rmse=0.10, R2=0.9, R22=0.68, clf.score=0.90
Pode ser visto que10O coeficiente do parâmetro do polinômio de grau 0 torna-se muito pequeno. A maioria delas está próxima de 0.
Além disso, é notável que, após o uso de modelos de penalidade como o Ridge Regression,1e2regressão polinomial de grau2O valor pode ser um pouco menor do que a regressão linear básica.
No entanto, tal modelo, mesmo usando100 polinômio, no treinamento400 amostras, a predição500 amostras, além de ter um R menor2Não apenas com erro, mas também com excelente capacidade de predição.
Isso é tudo o que há no artigo. Espero que ajude no seu aprendizado e que você apoie o Tutorial Yell.
Declaração: o conteúdo deste artigo é extraído da Internet, pertence ao respectivo proprietário e foi contribuído e carregado voluntariamente pelos usuários da Internet. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Atingido, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)