РЕГРЕССИЯ ПО НАБОРУ ДАННЫХ CSV.

В этом блоге мы изучим некоторые основные методы выполнения регрессии в наборе данных CSV.

ИСПОЛЬЗУЕМЫЕ ТЕХНИКИ: -

Линейные, полиномиальные, деревья решений, случайные леса и нейронные сети.

О наборе данных: -

Реклама продаж.

Набор данных загружен с Kaggle.

Ссылка:- https://www.kaggle.com/hellbuoy/sales-advertisment

Набор данных рекламируется в различных режимах, а именно на радио, телевидении и в газетах, и как они влияют на общие продажи. Различные индексы состоят из различных соотношений рекламы для различных продуктов и их общего вклада в продажи продукта.

Набор данных имеет 5 столбцов.

  1. Индекс: - Сохраняет запись серийного номера.
  2. ТВ:- Реклама через ТВ.
  3. Радио: - Реклама через радио.
  4. Газета: - реклама через Газету.
  5. Продажи: - Общий объем продаж.

Очистка данных

Это необходимый шаг для очистки данных на этапе предварительной обработки. Поэтому для строк мы определяем функцию для достижения того же самого.

def clean_str(string):
string = re.sub(r"\n", "", string)
string = re.sub(r"\r", "", string)
string = re.sub(r"[0–9]", "digit", string)
string = re.sub(r"\'", "", string)
string = re.sub(r"\"", "", string)

return string.strip().lower()

Получение некоторой информации о наборе данных

Мы можем добавить несколько функций, чтобы получить некоторую информацию о нашем наборе данных в качестве старта, прежде чем работать над ним.

df.info()

nRowsRead = ‘Нет’
df.dataframeName = ‘dataset.csv’
nRow, nCol = df.shape
print(f’Есть {nRow} строк и {nCol} столбцов’)

df.describe()

print("Длина набора данных:: ", len(df))
print("Форма набора данных:: ", df.shape)

Заполнение нулевых значений

Перед работой с нашим набором данных рекомендуется заполнить любые значения NULL, если они есть. Мы можем проверить то же самое, а затем заполнить значения «NaN», используя различные методы, такие как обратное заполнение.

df.isnull().сумма()

df = df.fillna(method = ‘bfill’)
df.isnull().sum()

Выбор функции

Иногда определенные столбцы не требуются для обработки, поэтому мы их опускаем. Этот шаг известен как выбор функции, когда мы удаляем ненужные данные.

Здесь мы опускаем столбец «Индекс».

df = df.drop (столбцы = ['Индекс'])

Анализ выбросов

Мы можем провести анализ выбросов для максимального вклада в несогласованность.

# Анализ выбросов целевой переменной с максимальным количеством несоответствий

выбросы = ['Продажи']
plt.rcParams['figure.figsize'] = [8,8]
sns.boxplot(data=df[выбросы], ориент=”v”, палитра= ”Set1 ,whis=1,5,saturation=1, width=0,7)
plt.title("Распределение переменных выбросов", fontsize = 14, fontweight = 'bold')
plt.ylabel("Sales Range ", fontweight = 'bold')
plt.xlabel("Непрерывная переменная", fontweight = 'bold')

Хотя в этом конкретном наборе данных мы не обнаружили серьезных несоответствий из-за выбросов как таковых.

Некоторый анализ данных перед регрессией

Мы всегда можем провести предварительный анализ наших данных. Здесь мы строим график продаж-распределения во времени. Кроме того, мы можем создать парную диаграмму или матрицу рассеяния всех числовых значений, чтобы получить приблизительное представление о взаимосвязи между различными столбцами. Также HeatMap сообщает нам объем отношений между различными атрибутами. Значение цвета ячеек пропорционально количеству измерений, соответствующих размерному значению.

Здесь мы обнаруживаем, что ТВ имеет несколько линейную связь с продажами.

plt.figure(figsize=(8,8))

plt.title('График распределения продаж')
sns.distplot(df['Продажи'])

sns.pairplot(df)

scatter_matrix (df, альфа = 0,2)

#HeatMap
fig, ax = plt.subplots(figsize=(10,10))
sns.heatmap(df.corr(),ax=ax,annot=True,linewidth=0,05,fmt= '.2f',cmap='магма')
plt.show()

Нормализация данных

Мы нормализуем наши данные. И отбросьте наш выходной столбец от нашей оси Y.

x = df.drop([‘Продажи’], axis=1)
y = df[‘Продажи’]
x = preprocessing.normalize(x)

Разделение набора данных

Теперь мы разделим наш набор данных на обучающий и тестовый наборы. Отношение tseting к обучающему набору данных, которое я использовал здесь, составляет 0,2, поскольку размер моего набора данных невелик. В идеале он может быть от 0,7 до 0,8.

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=2)

Давайте начнем с методов регрессии сейчас

Давайте сначала импортируем важные библиотеки.

из sklearn.linear_model импортировать линейную регрессию
из sklearn.metrics импортировать mean_squared_error
из sklearn.metrics импортировать mean_absolute_error
из sklearn.metrics импортировать r2_score

из sklearn.preprocessing импортировать PolynomialFeatures

из sklearn.tree импортировать DecisionTreeRegressor

из sklearn.ensemble импортировать RandomForestRegressor

импортировать предупреждения
из keras.models import Sequential,model_from_json
из keras.layers import Dense
из keras.optimizers import RMSprop

из sklearn.linear_model импортировать Lasso, ElasticNet, Ridge, SGDRegressor

Различные методы регрессии:-

Линейная регрессия

linearRegressor = LinearRegression()
linearRegressor.fit(x_train, y_train)
y_predicted = linearRegressor.predict(x_test)
mse = mean_squared_error(y_test, y_predicted)
r = r2_score(y_test, y_predicted)
mae = mean_absolute_error(y_test,y_predicted)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

Полиномиальная регрессия

polynomial_features= PolynomialFeatures(degree=2)
x_poly = polynomial_features.fit_transform(x_train)
x_poly_test = polynomial_features.fit_transform(x_test)
model = LinearRegression()
model.fit(x_poly, y_train)
y_predicted_p = model.predict(x_poly_test)
mse = mean_squared_error(y_test, y_predicted_p)
r = r2_score(y_test, y_predicted_p)
mae = mean_absolute_error(y_test,y_predicted_p)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

Деревья решений

regressor = DecisionTreeRegressor(random_state = 0)
regressor.fit(x_train, y_train)
y_predicted_d = regressor.predict(x_test)
mse = mean_squared_error(y_test, y_predicted_d)
r = r2_score(y_test, y_predicted_d)
mae = mean_absolute_error(y_test,y_predicted_d)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

Случайный лес

rf = RandomForestRegressor(random_state=0, n_estimators=300)
rf.fit(x_train,y_train);
y_predicted_r = rf.predict(x_test)
mse = mean_squared_error(y_test, y_predicted_r)
r = r2_score(y_test, y_predicted_r)
mae = mean_absolute_error(y_test,y_predicted_r)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

Нейронные сети

warnings.filterwarnings('ignore')
model = Sequential()
model.add(Dense(256, activation='relu', input_shape=(3,)))
model.add(Dense(256, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='relu'))
model.summary()
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mean_absolute_error'])
history = model.fit(x_train,y_train,batch_size=100,epochs=20,verbose=1)
test=model.evaluate(x_test, y_test, verbose=1)

Сингапурский доллар: -

SGD=SGDRegressor(max_iter=1000, tol=1e-3)
SGD.fit(x_train, y_train)
y_res = SGD.predict(x_test)
mse = mean_squared_error(y_test, y_res)
r = r2_score(y_test, y_res)
mae = mean_absolute_error(y_test,y_res)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

Лассо:-

l=Lasso(alpha=0.1)
l.fit(x_train, y_train)
y_res = l.predict(x_test)
mse = mean_squared_error(y_test, y_res)
r = r2_score(y_test, y_res)
mae = mean_absolute_error(y_test,y_res)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

хребет:-

ridge=Ridge(alpha=0.1)
ridge.fit(x_train, y_train)
y_res = ridge.predict(x_test)
mse = mean_squared_error(y_test, y_res)
r = r2_score(y_test, y_res)
mae = mean_absolute_error(y_test,y_res)
print("Mean Squared Error:",mse)
print("R score:",r)
print("Mean Absolute Error:",mae)

После запуска всех методов для этого конкретного набора данных мы обнаруживаем, что полиномиальная регрессия подходит лучше всего.

Получите полный код по адресу: https://colab.research.google.com/drive/1LSatJutKhkvYClvxfld1kuqNCScsZBmY.

Аларш Тивари.