Машинное обучение фактический бой: Машинная регрессия опорного вектора для прогнозирования бюджетных доходов
Описание набора данных Набор данных Характеристика описание Анализ признаков Визуализация объектов Импорт данных визуализация Обнаружение корреляции признаков Нарисуйте корреляционную матрицу Print Коэффициент корреляции Пирсона Многомерное исследование Модель выбора объектов лассо для извлечения объектов Выбор параметра альфа (коэффициент регулярного члена) Выполнить выбор объекта Используйте функции ядра для прогнозирования Предварительная обработка данных, разделение наборов данных, разделение на обучающие наборы и тестовые наборы Делать прогнозы Нарисуйте сравнительную диаграмму фактического финансового дохода и прогнозируемого дохода Выполнить простую оценку прогностической модели MSE (среднеквадратичная погрешность) RMSE (среднеквадратичная ошибка) MAE (средняя абсолютная погрешность) R^2
Мы проанализируем характеристики данных, которые были в основном обработаны, а затем выберем характеристики и используем машинную регрессию опорных векторов для прогнозирования будущих бюджетных доходов.
Описание набора данных
Набор данных
Характеристика описание
свойство название
x1 Количество социальных практиков
x2 Общая заработная плата работников без отрыва от производства
х3 Итого розничных продаж потребительских товаров
x4 Располагаемый доход на душу населения городских жителей
x5 Среднедушевые потребительские расходы городских жителей
x6 Общая численность населения на конец года
x7 Инвестиции в основной капитал всего общества
x8 Валовой региональный продукт
x9 Стоимость продукции первичной промышленности
х10 налогообложение
х11 Индекс потребительских цен
x12 Отношение стоимости выпуска продукции третичной промышленности к вторичной промышленности
х13 Уровень потребления резидентов
y Финансовые доходы
Анализ признаков
Почему следует проводить анализ признаков?Поскольку данные и характеристики определяют верхний предел машинного обучения, модели и алгоритмы приближаются только к этому верхнему пределу.Для того чтобы модель имела лучшие результаты, анализ и извлечение признаков очень важны.
Визуализация объектов
Сначала импортируйте все библиотеки, которые мы будем использовать дальше
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
import pandas as pd
from collections import Counter
import csv
import warnings
import seaborn as sns
import matplotlib
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVR
from sklearn.svm import LinearSVR
from sklearn import metrics
from sklearn.metrics import mean_squared_error
from math import sqrt
Импорт данных
data = pd.read_csv(r'C:\data.csv')
x_data = data.drop('y', 1)
y_data = data.loc[:, 'y']
name_data = list(data.columns.values)
Визуализация
warnings.filterwarnings("ignore") # 排除警告信息
fig = plt.figure()
fig.set_size_inches(14, 9)
for i in range(13):
ax = fig.add_subplot(4, 4, i+1)
x = x_data.loc[:, name_data[i]]
y = y_data
plt.title(name_data[i])
ax.scatter(x, y)
plt.tight_layout() # 自动调整子图间距
plt.show()
Как видно из рисунка результатов операции, за исключением признака x11, остальные признаки линейно связаны и монотонно увеличиваются.
Обнаружение корреляции признаков
Корреляционный анализ является очень важной частью оценки качества объектов. Рациональный выбор объектов и поиск объектов с наиболее сильной корреляцией с подходящей целью часто позволяют быстро получить результаты и достичь мультипликативного эффекта с половиной усилий.Корреляционный анализ относится к анализу двух или более элементов признака с корреляцией для измерения степени корреляции между двумя факторами признака. Коэффициент корреляции Пирсона используется для измерения взаимосвязи между двумя признаками X и Y (сила линейной корреляции), которая является простейшим коэффициентом корреляции.Затем коэффициент корреляции Пирсона и построенная корреляционная матрица будут использоваться для обнаружения корреляции признаков.
Нарисуйте корреляционную матрицу
plt.figure(figsize=(12, 8))
sns.heatmap(data.corr(), annot=True, fmt='.2f', cmap='PuBu')
plt.title('各个特征中的相关性')
plt.show()
Print Коэффициент корреляции Пирсона
print(data.corr()['y'].sort_values())
Связь между коэффициентом корреляции и корреляцией
Актуальность
|
Коэффициент корреляции (отрицательное значение)
|
Коэффициент корреляции (положительное значение)
|
не относящийся к делу
|
-0.09~ 0
|
0~0.09
|
Низкая корреляция
|
-0.3 ~ -0.1
|
0.1~0.3
|
Средний релевантный
|
-0.5 ~ -0.3
|
0.3~0.5
|
Существенно связанные
|
-1.0 ~ -0.5
|
0.5~1.0
|
Из диаграммы коэффициента корреляции и коэффициента корреляции ясно видно, что корреляция между признаком X11 и признаком y является низкой корреляцией, а другие признаки значительно коррелируют.
Многомерное исследование
Здесь мы пытаемся провести многомерное исследование, чтобы понять взаимосвязь между зависимыми переменными и независимыми переменными, независимыми переменными и независимыми переменными.Поскольку данные содержат 13 переменных и одну зависимую переменную, отобразить график сложно, поэтому в качестве группы для исследования выбираются 4.
sns.pairplot(data[["x1", "x2", "x3", "x4"]])
sns.pairplot(data[["x5", "x6", "x7", "x8"]])
sns.pairplot(data[["x9", "x10", "x12", "x13"]])
plt.tight_layout() # 自动调整子图间距
plt.show()
Модель выбора объектов лассо для извлечения объектов
Метод регрессии Лассо относится к разновидности метода регуляризации-компрессионной оценке.Лассо-это метод оценки сжатия с идеей уменьшения набора признаков (уменьшения порядка).Метод Лассо может сжать коэффициенты признаков и сделать так, чтобы некоторые коэффициенты регрессии стали равными 0, чтобы достичь цели выбора признаков, которая может быть широко использована при улучшении и выборе модели.
Выбор параметра альфа (коэффициент регулярного члена)
Попробуйте использовать параметр for loop alpha, чтобы изменить оценку лассо с 0 на 50
scaler = StandardScaler()
X = scaler.fit_transform(x_data)
Y = y_data
names = name_data
coef = []
for i in range(30):
lasso = Lasso(alpha=i)
lasso.fit(X, Y)
coef.append(lasso.score(X, Y))
plt.plot(range(30), coef)
plt.xlabel("alpha值")
plt.ylabel("lasso得分")
plt.show()
Из приведенного выше рисунка видно, что значение параметра alpha изменяет оценку лассо на выбранное значение 0-30. Конечно, вы также можете попробовать взять параметр alpha ниже 1.0, чтобы увидеть изменение оценки лассо. Здесь выберите alpha=20 для извлечения объектов.
Выполнить выбор объекта
lasso = Lasso(alpha=20)
lasso.fit(X, Y)
print(lasso.score(X, Y))
print(lasso.coef_)
Судя по результатам работы, выберите для обучения три функции x3, x5 и x7.
x = x_data.drop('x11', 1)
name = list(x.columns.values)
for i in name:
if i == 'x3':
continue
elif i == 'x5':
continue
elif i == 'x7':
continue
else:
x = x.drop(i, 1)
Используйте функции ядра для прогнозирования
Опорная векторная регрессия не только подходит для линейных моделей, но и может хорошо понять нелинейную взаимосвязь между данными и объектами; опорная векторная регрессия не должна беспокоиться о множественных проблемах коллинеарности, которые могут избежать проблем локальной минимизации, улучшить производительность обобщения и решить многомерные проблемы; хотя опорная векторная регрессия не будет непосредственно исключать точки выбросов в процессе, она сделает отклонение, вызванное точками выбросов, меньше, поэтому здесь я использую функцию ядра SVR для прогнозирования
Предварительная обработка данных, разделение наборов данных, разделение на обучающие наборы и тестовые наборы
train_data, test_data, train_target, test_target = train_test_split(x, y_data, test_size=0.3)
Stand_X = StandardScaler() # 把特征进行标准化
Stand_Y = StandardScaler() # 标签也是数值,也需要进行标准化
train_data = Stand_X.fit_transform(train_data)
test_data = Stand_X.transform(test_data)
train_target = Stand_Y.fit_transform(train_target.values.reshape(-1, 1)) # reshape(-1,1)指将它转化为1列,行自动确定
test_target = Stand_Y.transform(test_target.values.reshape(-1, 1))
Делать прогнозы
clf = LinearSVR(C=2)
clf.fit(train_data, train_target)
y_pred = clf.predict(test_data)
print("线性核函数:")
print("训练集评分:", clf.score(train_data, train_target))
print("测试集评分:", clf.score(test_data, test_target))
Нарисуйте сравнительную диаграмму фактического финансового дохода и прогнозируемого дохода
hos_pre = pd.DataFrame()
hos_pre['预测值'] = y_pred
hos_pre['真实值'] = test_target
hos_pre.plot(figsize=(8, 4))
plt.show()
Выполнить простую оценку прогностической модели
При оценке модели мы будем использовать ее далее
MSE (среднеквадратичная погрешность)
MSE является наиболее часто используемой функцией потерь в линейной регрессии, и функция потерь максимально минимизируется в процессе линейной регрессии.Чем меньше значение MSE, тем выше точность предсказания модели для описания экспериментальных данных.
RMSE (среднеквадратичная ошибка)
RMSE очень чувствителен к отражению очень больших или очень малых ошибок в наборе измерений, поэтому стандартная ошибка может хорошо отражать точность измерения.
MAE (средняя абсолютная погрешность)
MAE - это среднее значение абсолютной погрешности, которое может лучше отражать фактическую ситуацию погрешности прогнозируемого значения.
R^2
R^2 также называется коэффициентом детерминации, также известным как степень соответствия, который отражает степень, в которой независимая переменная x объясняет изменение зависимой переменной Y.Чем ближе он к 1, тем лучше подходит модель.
Конкретные формулы вывода и подробные значения этих показателей можно посмотреть в официальных документах.
Используйте эти 4 показателя для оценки модели:
MSE = np.sum((y_pred-test_target)**2)/len(test_target)
MAE = np.sum(np.absolute(y_pred-test_target))/len(test_target)
print("测试集均方差:", metrics.mean_squared_error(test_target, y_pred.reshape(-1, 1)))
print("测试集R2分:", metrics.r2_score(test_target, y_pred.reshape(-1, 1)))
print("MSE", MSE)
print("MAE", MAE)
print('RMSE:{:.4f}'.format(sqrt(MSE))) #RMSE(标准误差)
Тестовый набор R^2 очень близок к 1, поэтому модель имеет относительно высокую степень хорошей подгонки.Значения MSE, MAE и RMSE не очень высоки, поэтому модель обладает хорошей точностью описания экспериментальных данных.Конечно, также возможно, что набор данных слишком мал, поэтому результат будет хорошим.
Do'stlaringiz bilan baham: |