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

Внимание навигаторам! Если кто-то прибыл сюда, не имея особого представления о машинном обучении или даже о программировании, очень вероятно, что он увидит новые слова или концепции и может захотеть ударить кулаком по экрану, ничего не понимая. Те чувства привязанности к вашему компьютеру, которые были у всех нас, никто не родился программистом, поэтому я призываю вас следовать инструкциям понемногу.

Сегодня мы собираемся изучить машинное обучение, решив одну из основных задач, найденных в Kaggle. Kaggle — это совершенно бесплатная платформа для онлайн-конкурсов для людей, которые любят или работают в области Data Science. Поскольку компании финансово вознаграждают участников, которые максимально точно решают свои проблемы, сообщество является богатым источником идей, моделей, методов и знаний, позволяющих вывести ваши навыки на новый уровень.

Задача, которую мы собираемся использовать, — это та, которую платформа считает «проблемой обучения» и называется «Цены на жилье: расширенные методы регрессии» и пытается предсказать цену ряда домов на основе заданного набора переменных.

Мы будем использовать язык программирования Python (версия 3), чтобы предложить наилучшее соотношение между простотой написания кода и результатом (принимаю нижеприведенные отзывы от фанатов R). В качестве IDE я использую Spyder, который по умолчанию входит в пакет ANACONDA.

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

— Шаг первый, понять проблему.

В этой задаче нас просят оценить стоимость набора домов из таблицы с 80 столбцами, содержащими различные переменные, такие как наличие бассейна, качество пола, гараж, количество комнат, квадратных метров…. Вывод, который нужно отправить в Kaggle, представляет собой CSV-файл с двумя столбцами: ID и ориентировочная цена дома. Следовательно, переменная, которую нам нужно будет оценить, также известная как зависимая переменная или Y, — это SalesPrice или цена дома. Чтобы решить эту проблему, Kaggle предоставляет два набора данных: формат excel in train CSV (содержащий 80 переменных плюс цену свойства) и test excel (содержащий 80 переменных, но логически не последний столбец цены свойства, которое у нас есть). вычислять).

Оценка автоматически рассчитывается платформой Kaggle после того, как мы загружаем CSV-файл как разницу между предполагаемыми ценами с нашей моделью тестового файла и реальными ценами (которые логически известны только им).

Рекомендация: я обнаружил, что, потратив 10 минут на обдумывание и рисование на бумаге того, что я собираюсь сделать, можно сэкономить много часов написания кода без логики.

— Второй шаг, подготовка или точная настройка данных:

  1. Мы загрузили файлы CSV (train.csv и test.csv) с веб-сайта https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data и текстовый файл data_description.txt. В этом типе соревнований или задач обычно есть файл обучения, который вы будете использовать в течение всего обучения вашей модели, и еще один тестовый файл, который будет использоваться для имплантации вашей обученной модели.

2. Сохраняем их в каталоге, где мы собираемся работать с python и создаем новый файл python с именем solution.py.

3. Импортируем библиотеки, которые будем использовать. Pandas (игра с таблицами), numpy (игра с векторами), matplotlib (визуализация данных) и sklearn (алгоритмы искусственного интеллекта на основе Google и экономящие время). Если вы хотите, чтобы визуализация данных была более красивой, я рекомендую библиотеку seaborn, которую мы не используем в этом примере.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.metrics import mean_squared_error

— Шаг третий, знайте факты (краткий обзор того, с чем вы столкнулись): №1. Импортируем как CSV (обучающий, так и тестовый)

train=pd.read_csv(“train.csv”)
test=pd.read_csv(“test.csv”)

№ 2. Делаем фигуру (чтобы знать количество строк и столбцов)

print (“El train shape: “,train.shape)
print (“El test shape: “, test.shape) # We pay attention that the dependent variable (sales prices) is not included, as we said before.

№3. Посмотрим на первые данные:

train.head()

№ 4. Мы описываем оцениваемую переменную, которая будет нашей зависимой переменной (Y)

train.SalePrice.describe()

- Шаг четвертый, подготовьте данные.

№1. Мера несоответствия или формы (асимметрия) оцениваемой переменной (SalesPrice). Мы делаем этот шаг, чтобы увидеть, нужно ли нам сделать какое-то преобразование журнала. Как «золотое правило», если мы видим, что зависимая переменная представляет асимметрию как влево, так и вправо, мы преобразуем ее в логарифмическую.

print (“Skew is: “, train.SalePrice.skew()
plt.style.use(style=”ggplot”)
plt.rcParams[“figure.figsize”]=(10,6)
plt.hist(train.SalePrice,color=”blue”)
plt.show() #Positive asymmetry or to the right.

№ 2. Мы преобразуем зависимую переменную Y в логарифмическую, потому что она асимметрична.

target=np.log(train.SalePrice)
print (“El valor de la Y es :”, target.skew())
plt.hist(target,color=”blue”)
plt.show()

№3. Мы берем числовые переменные и сохраняем их во фрейме данных.

numeric_features=train.select_dtypes(include=[np.number])

№ 4. Измеряем корреляцию между столбцами.

numeric_features.dtypes

#5.Мы измеряем корреляцию с зависимой переменной SalesPrice:

corr=numeric_features.corr()
print (corr.SalePrice.sort_values(ascending=False)[:5],”\n”) # Cogemos las cinco con mayor corrlación con SalesPrice
print (corr.SalePrice.sort_values(ascending=True)[:5]) # We take the five with the lowest correlation to SalesPrice

# Запрос наиболее коррелированной переменной:

train.OverallQual.unique() #unique values of the variable

# Мы создали сводную таблицу, чтобы исследовать взаимосвязь между этой переменной и SalePrice.

quality_pivot=train.pivot_table(index=”OverallQual”,values=”SalePrice”,aggfunc=np.median)
print (quality_pivot)

Показываем это на экране (обычно помогает наглядно увидеть, что вы делаете):

quality_pivot.plot(kind=”bar”,color=”blue”)
plt.xticks(rotation=0)
plt.show()

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

#We look at the next most correlated variable, GrLivArea. 
plt.scatter(x=train[“GrLivArea”],y=target) 
plt.show()

# Мы смотрели GarageArea:

plt.scatter(x=train[“GarageArea”], y =target)
plt.show()

- Quinto paso, eliminamos Outliers, Null y Missing Values:

№1. Элиминамос ВЫБРОСЫ. С векторным методом, связанным с серией панд с индексом y True и апостериорным шагом с пандами DataFrame

train=train[train.GarageArea <1200]
print (train)
plt.scatter(x=train.GarageArea,y=np.log(train.SalePrice)) #Detail, in "y" you have to create the variable again and not take the one you had from Target
plt.show()

#2.NULL и ОТСУТСТВУЮЩИЕ ЗНАЧЕНИЯ
# Поиск пустых значений:

null=pd.DataFrame(train.isnull().sum().sort_values(ascending=False)[:25])
print (null)

#Чтобы понять, почему отсутствуют значения, вы можете посмотреть документацию.

print (“Unique values are:”, train.MiscFeature.unique())
data=train.select_dtypes(include=[np.number]).interpolate().dropna()

# Проверяем, все ли столбцы имеют 0 нулевых значений:

print (sum(data.isnull().sum())) # If the result is zero then there is no value that is 0

- Шаг шестой: инженерная отделка.

Это не что иное, как преобразование переменных, которые НЕ являются числовыми, такими как: синий, красный, зеленый по числам с использованием так называемого горячего кодирования. Поскольку не имеет смысла давать 1 синему, 2 — красному и 3 — зеленому, потому что мы будем считать, что красный в два раза дороже синего, а зеленый в три раза дороже синего, мы создаем столбец для каждой переменной и присвойте ему ноль, если переменная есть, и 0, если ее нет. Это преобразование должно быть выполнено как в файлах Train, так и в Test.

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

№1. Мы смотрим на категориальные переменные.

categoricals=train.select_dtypes(exclude=[np.number])
categoricals.describe() # We use it to see at a glance the names of the variables that we will change to 0 and 1.

В зависимости от количества значений в переменной и их распределения мы будем преобразовывать их тем или иным образом. Как правило, если есть 2 луча:

pd.get_dummies(COLUMNA, drop_first=True)

С другой стороны, если имеется более двух переменных, мы видим, есть ли четкая разница между одним из значений и остальными (тогда мы присваиваем этой переменной значение 1, а остальным — 0), если распределение больше uniform тогда мы делаем горячее кодирование для каждой из переменных.

Вот пример трех возможностей.

? Случай 1. Мы выбираем переменную Street и создаем новый столбец. Так как есть только два значения, мы опускаем первое.

train[‘enc_street’] = pd.get_dummies(train.Street, drop_first=True)
test[‘enc_street’] = pd.get_dummies(train.Street, drop_first=True)

Случай 2. Выберите переменную SaleCondition и измените ее на enc_condition:

condition_pivot=train.pivot_table(index=”SaleCondition”,values=”SalePrice”,aggfunc=np.median)
condition_pivot.plot(kind=”bar”,color=”blue”)
plt.show()

Кодирование переменной, и мы присваиваем ей 1, если она неполная (поскольку это та, которая дебютирует с большим количеством значений)

def encode(x): return 1 if x == ‘Partial’ else 0
train[‘enc_condition’] = train.SaleCondition.apply(encode)
test[‘enc_condition’] = test.SaleCondition.apply(encode)

Случай 3. Выбираем переменную LotShape.

print (train.LotShape.unique())
pt=train.pivot_table(index=”LotShape”,values=”SalePrice”,aggfunc=np.median)
pt.plot(kind=”bar”,color=”blue”)
plt.show()
LotShape_D=pd.get_dummies(train.LotShape)
train=pd.concat([train,LotShape_D],axis=1)
test=pd.concat([test,LotShape_D],axis=1)

Шаг седьмой: мы строим модель.

№1. Разделим зависимую v.(Y) и независимую v.(X):

y=np.log(train.SalePrice)
x=data.drop([“SalePrice”,”Id”], axis=1)

№ 2. Set de entrenamiento Creamos y hold out set.

X_train,X_test,y_train,y_test=train_test_split(x,y,random_state=42,test_size=.33)

№3. Моделирование.

lr=linear_model.LinearRegression()

№ 4. Подгонка модели. С четырьмя параметрами X train, X_test, y_train, y_test

model=lr.fit(X_train,y_train)

Шаг 8: Оценка модели.

№1. Оценка производительности модели.
? Kaggle в этом конкурсе оценивает модель с помощью RMSE. Мы также посмотрим на r-квадрат, чтобы увидеть, насколько данные близки к линии регрессии.

print (“R² is: \n”, model.score(X_test,y_test))

№ 2. Прогноз:

predictions=model.predict(X_test)# Returns a list of predictions given a set of predictors

№3. Вычисление mean_squared_error (rmse). Измеряет расстояние между нашими и фактическими значениями.

print (“RMSE is: \n”, mean_squared_error(y_test,predictions))
actual_values=y_test
plt.scatter(predictions,actual_values,alpha=.75,color=”b”) 
plt.xlabel(“Predicted Price”) 
plt.ylabel(“Actual Price”)
plt.title(“Linear Regression Model”) 
plt.show()

Шаг девятый. Мы загрузили файл.

Kaggle, предоставьте пример файла того, что нам нужно загрузить на платформу. В этом случае это столбец с идентификатором домов теста CSV, а в другом столбце цена, которую мы предсказали для этих домов из модели.

Поэтому мы создадим фреймворк данных pandas, содержащий один столбец с идентификатором и ценой.

submission=pd.DataFrame()
submission[“ID”]=test.Id
feats=test.select_dtypes(include=[np.number]).drop([“Id”],axis=1).interpolate()
predictions=model.predict(feats)

Мы преобразуем прогноз в правильную форму, из log() в exp(), выполнив np.exp().

final_predictions=np.exp(predictions)
print (“original predictions: \n”,predictions[:5],” \n”)
print (“Final predictions: \n”, final_predictions[:5])
submission[“SalePrice”]=final_predictions
#We correct certain particular details before sending:
#We've eliminated the last row:
submission=submission[:-1]

Изменяем тип данных первого столбца, который необходимо интегрировать.

submission[“ID”]=submission.ID.astype(“int64”)
print (submission)
#Convertimos a CSV
submission.to_csv(“submission1.csv”,index=False)

- Возможные быстрые улучшения, которые могут быть включены в модель.

№1. Регуляризация хребта => Этот процесс уменьшает вес коэффициентов, которые менее важны в регрессии.
# Изменяем значение альфы

for i in range(-2,3):
 alpha=10**i
 rm=linear_model.Ridge(alpha=alpha) 
 ridge_model= rm.fit(X_train,y_train)
 preds_ridge=ridge_model.predict(X_test)
 
 plt.scatter(preds_ridge,actual_values,alpha=.75,color=”b”) 
 plt.xlabel(“Predicted Price”) 
 plt.ylabel(“Actual Price”)
 plt.title(“Eidge Regularization with alpha = {}”.format(alpha))
 overlay=”R² is: {}\n RMSE is: {}”.format(
 ridge_model.score(X_test,y_test),
 mean_squared_error(y_test,preds_ridge))
 
 plt.annotate(s=overlay,xy=(12.1,10.6),size=”x-large”)
 plt.show()

- - - - - - - - - - - - - -КОНЕЦ - - - - - - - - - - - - -

Первая поставка в соревновании Kaggle завершена. Очень вероятно, что есть концепции, которые еще предстоит углубить, потому что, когда мы используем библиотеки, мы обычно не осознаем, что происходит позади нас, и есть много новых концепций. Я открыт для любых предложений, идей или модификаций, если они сделаны с уважением.

В заключение, мой совет: просто продолжайте практиковаться. Корреляцию между количеством написанных строк кода и вашим уровнем я еще не измерял, но уверен, что она достаточно высока :) Помните, чтобы научиться плавать, недостаточно просто прочитать книгу о том, как плавать .

Любые вопросы, не стесняйтесь оставлять их ниже.

Вы можете следить за мной на:

Instagram=›https://www.instagram.com/rubenruiz_t/

Гитхаб =› https://github.com/RubenRuizT

Youtube =› Рубен Руис А.И.