Машина что? Что это? Это основные вопросы, которые мне задают, когда я говорю им, что работаю с машинным обучением и искусственным интеллектом. Поэтому из-за отсутствия контента на испанском языке я решил сделать серию коротких руководств по искусственному интеллекту, машинному обучению и глубокому обучению.
Внимание навигаторам! Если кто-то прибыл сюда, не имея особого представления о машинном обучении или даже о программировании, очень вероятно, что он увидит новые слова или концепции и может захотеть ударить кулаком по экрану, ничего не понимая. Те чувства привязанности к вашему компьютеру, которые были у всех нас, никто не родился программистом, поэтому я призываю вас следовать инструкциям понемногу.
Сегодня мы собираемся изучить машинное обучение, решив одну из основных задач, найденных в 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 минут на обдумывание и рисование на бумаге того, что я собираюсь сделать, можно сэкономить много часов написания кода без логики.
— Второй шаг, подготовка или точная настройка данных:
- Мы загрузили файлы 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 =› Рубен Руис А.И.