[Искусственный интеллект плиты] Машинное обучение 005 — Создание и тестирование полиномиальных регрессоров
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Простой линейный регрессор и гребенчатый регрессор упоминались ранее.Оба типа регрессоров укладывают набор данных в прямую линию, но в реальной жизни есть много ситуаций, когда распределение набора данных не является простой линейной зависимостью, и это возможно. Это отношение кривой, отношение кластеризации, отношение случайного распределения и т. д. Для этих различных отношений распределения наборов данных необходимо использовать разные регрессоры.
1. Проанализируйте набор данных
Из-за отсутствия набора данных я сам сгенерировал некоторые данные с помощью кода, процесса генерации данных и ([Искусственный интеллект плиты] Машинное обучение 003 — Создание, тестирование, сохранение модели и загрузка простого линейного регрессора) аналогично следующему коду.
# 构建服从多项式回归特性的数据集
np.random.seed(37) # 使得每次运行得到的随机数都一样
x=np.arange(2,102)
x_shift=np.random.normal(size=x.shape)
x=x+x_shift # 构建的x含有100个数,通过在整数点引入偏差得到
error=np.random.normal(size=x.shape)*800 # 构建噪音,*800是扩大噪音的影响
y=1.19*x*x+0.82*x+5.95+error
plt.scatter(x,y) # 可以查看生成的数据集的分布情况
dataset=[(i,j) for i,j in zip(x,y)]
from sklearn.model_selection import train_test_split
train_set,test_set=train_test_split(dataset,test_size=0.2,random_state=37)
X_train=np.array([i for (i,j) in train_set]).reshape(-1,1) # 后面的fit需要先reshape
y_train=np.array([j for (i,j) in train_set]).reshape(-1,1)
X_test= np.array([i for (i,j) in test_set]).reshape(-1,1)
y_test= np.array([j for (i,j) in test_set]).reshape(-1,1)
########################резюме########################## ######
1. При построении набора данных можно использовать метод внесения ошибок в стандартные данные.
2. В регрессионных или классификационных моделях набор данных часто отображается на двумерной плоскости, а пространственное распределение набора данных просматривается с помощью точечных диаграмм Только после получения интуитивного начального впечатления можно подобрать более подходящую регрессионную или регрессионную модель. быть выбран классификационная модель.
#################################################################
2. Набор данных, подходящих для модели простого линейного регрессора
Набор данных, показанный на рисунке, кажется, подчиняется линейной зависимости, а также, кажется, подчиняется полиномиальной зависимости.В этом случае вы можете сначала использовать простой линейный регрессор, чтобы соответствовать модели регрессии, а затем использовать тестовый набор, чтобы увидеть плюсы и минусы модели. Следующий код:
# 如果采用简单线性回归器进行拟合得到简单的拟合直线
from sklearn import linear_model
linear_regressor=linear_model.LinearRegression() # 创建线性回归器对象
linear_regressor.fit(X_train,y_train) # 使用训练数据集训练该回归器对象
# 查看拟合结果
y_predict=linear_regressor.predict(X_train) # 使用训练后的回归器对象来拟合训练数据
plt.figure()
plt.scatter(X_train,y_train,label='train_set')
plt.scatter(X_test,y_test,color='r',label='test_set')
plt.plot(X_train,y_predict,'-b',linewidth=3,label='fitted_line')
plt.legend()
# 用测试集看看该线性回归器模型的测试结果
y_predict_test=linear_regressor.predict(X_test)
import sklearn.metrics as metrics
print('简单线性回归器模型的评测结果----->>>')
print('均方误差MSE:{}'.format(
round(metrics.mean_squared_error(y_predict_test,y_test),2)))
print('解释方差分:{}'.format(
round(metrics.explained_variance_score(y_predict_test,y_test),2)))
print('简单线性回归器得到的直线方程为:y={:.3f}x+{:.3f}'
.format(linear_regressor.coef_[0][0],linear_regressor.intercept_[0]))
------------------ потерять --------- вывод ------------ ---------- ----------
Результаты оценки простой модели линейного регрессора:
Среднеквадратическая ошибка MSE: 1906916,26
Объясненная оценка дисперсии: 0,85
Уравнение линии, полученное с помощью простого линейного регрессора: y=117,061x+-1924,904
---------------------------------Заканчивать---------------- ---------------------
########################резюме########################## ######
1. СКО модели, полученной с помощью простого линейного регрессора на тестовом наборе, очень велика, и кажется, что остается еще очень много места для оптимизации.
#################################################################
3. Используйте полиномиальный регрессор
Поскольку простая модель линейного регрессора очень плохо работала с этим набором данных, нам нужно было улучшить модель, поэтому мы попытались использовать полиномиальный регрессор.
# 使用多项式回归器来对数据集进行拟合,得到多项式方程
from sklearn.preprocessing import PolynomialFeatures
polynomial=PolynomialFeatures(degree=2) # 构建多项式回归器对象
# degree是多项式的次数,此处初步的设置为2
X_train_transformed=polynomial.fit_transform(X_train)
# print(X_train_transformed) #transformed之后的数据是degree+1维
from sklearn import linear_model
poly_regressor=linear_model.LinearRegression() # 也是构建线性回归器
poly_regressor.fit(X_train_transformed,y_train) # 对多项式回归器进行训练
# 查看拟合结果
y_predict_polynomial=poly_regressor.predict(X_train_transformed)
plt.figure()
plt.scatter(X_train,y_train,label='train_set')
plt.scatter(X_test,y_test,color='r',label='test_set')
# print(y_predict_polynomial.shape) #(80, 1)
plt.plot(X_train,y_predict_polynomial,'-b',linewidth=3,label='fitted_poly')
# 上面的plot会产生很多条线。。。。。
plt.legend()
# 用测试集看看该线性回归器模型的测试结果
X_test_transformed=polynomial.fit_transform(X_test)
y_predict_test=poly_regressor.predict(X_test_transformed)
import sklearn.metrics as metrics
print('多项式回归器模型的评测结果----->>>')
print('均方误差MSE:{}'.format(
round(metrics.mean_squared_error(y_predict_test,y_test),2)))
print('解释方差分:{}'.format(
round(metrics.explained_variance_score(y_predict_test,y_test),2)))
print('得到的多项式方程为:y={:.3f}x^2+({:.3f}x)+{:.3f}'
.format(poly_regressor.coef_[0][-1],
poly_regressor.coef_[0][-2],
poly_regressor.intercept_[0]))
------------------------------ потерять --------- выход --------- --------------------
Результаты оценки модели полиномиального регрессора:
Среднеквадратическая ошибка MSE: 525885,05
Объясненная оценка дисперсии: 0,97
Полученное полиномиальное уравнение: y=1,374x^2+(-22,187x)+487,664.
---------------------------------Заканчивать---------------- ---------------------
########################резюме########################## ######
1. Чтобы использовать полиномиальный регрессор, вам сначала нужно преобразовать вектор признаков X в соответствующее измерение с помощью функции fit_transform(), а затем использовать fit() объекта LinearRegression() для обучения.
2. Хотя для подгонки используется полиномиальный регрессор, полученная СКО по-прежнему относительно велика, но меньше, чем СКО, полученная с помощью линейного регрессора. Так является ли индикатор MSE ненадежным?
3. С точки зрения оценки объясненной дисперсии полиномиальный регрессор имеет большее улучшение на тестовом наборе со значением 0,97.
4. На рисунке много линий, потому что 19 строк plt.plot(X_train, y_predict_polynomial) рисовались много раз, я не понимаю, почему на графике много линий.
#################################################################
4. Делайте прогнозы на основе новых данных
Для обученной модели, будь то простой линейный регрессор или немного более сложный полиномиальный регрессор, он должен использоваться для прогнозирования новых данных Я буду использовать эти два регрессора для прогнозирования новых данных.
# 使用多项式回归器预测新的数据值
data_X=[[66]] # 需要计算的数据点 X值
print('用直线回归器得到的数值:{}'.format(linear_regressor.predict(data_X)))
print('用拟合直线计算的数值:{}'.format(
linear_regressor.coef_[0][0]*data_X[0][0]+linear_regressor.intercept_[0]))
data_X_transormed=polynomial.fit_transform(data_X)
data_X_predict=poly_regressor.predict(data_X_transormed)
# print(poly_regressor.coef_, '\n',poly_regressor.intercept_)
print('用多项式回归器得到的数值:{}'.format(data_X_predict))
print('用多项式曲线计算的数值:{}'.format(
poly_regressor.coef_[0][-1]*np.power(data_X[0][0],2)+
poly_regressor.coef_[0][-2]*data_X[0][0]+
poly_regressor.intercept_[0]))
# 两者数据相等,代表predict的确是按照这个曲线方程来计算的。
------------------------------ потерять --------- выход --------- --------------------
Значение, полученное с помощью линейного регрессора: [[5801.09012059]] Значение, рассчитанное с помощью встроенной прямой линии: 5801.090120592645 Значение, полученное с помощью полиномиального регрессора: [[5010.58753529]] Значение, рассчитанное с помощью полиномиальной кривой: 5010,587535291616
---------------------------------Заканчивать---------------- ---------------------
########################резюме########################## ######
1. Из-за разных моделей результаты, полученные при прогнозировании новых данных, также различаются, но, поскольку модель полиномиальной регрессии имеет больший показатель объясненной дисперсии для тестового набора, мы считаем, что модель полиномиальной регрессии в этом примере лучше, поэтому Прогнозы на новых данных более надежны.
2. Если некоторые наборы данных не подчиняются простому биномиалу, вы можете увеличить значение степени в PolynomialFeatures(степень=2), чтобы увеличить наивысшую степень x, и результирующая модель может быть более точной, но это необходимо для предотвращения модель из Overfitting of the train set.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.