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

рептилия

предисловие

Что нам нужно сделать, так это сделать это самостоятельно, просканировать информацию на сайте аренды на 58.com, а затем использовать данные для прогнозирования цены на неизвестное жилье.

Исходный код состоит из трех частей: машинного обучения, веб-интерфейса и сканера.

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

В этой статье реализованы три алгоритма прогнозирования регрессии:


1. Регрессия опорных векторов (SVR)

2. Логистическая регрессия

3. И регрессия хребта (регрессия L2) с использованием трюков ядра

Процесс реализации

Полный код проекта выложен на github, а реализация этой части здесь:

https://github.com/TomorrowIsBetter/crawler/tree/master/price_prediction

Файл index.csv в этом каталоге является частью извлеченных файловых данных. Мы можем напрямую посмотреть на формат файла:


_id,date,areas,square,methods,price,direction,type,houseAreas
http://cc.58.com/zufang/34009015301200x.shtml,1.53E+12,0,190,1,20000,0,4 комнаты, 2 зала, 2 ванные комнаты, CITIC City (Вилла)
http://cc.58.com/zufang/33977466998861x.shtml,1.53E+12,0,190,1,20000,0,4 комнаты, 2 зала, 2 ванные комнаты, CITIC City (Вилла)
http://cc.58.com/zufang/32214749419981x.shtml,1.53E+12,5,400,1,15000,0,4 комнаты, 3 зала, 3 ванные комнаты, Sunac Shangcheng
http://cc.58.com/zufang/34129082983861x.shtml,1.53E+12,0,500,1,15000,0,5 Комната 3 Зал 2 Ванная комната, Чжунхай Рейн Восточный округ

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

обучение модели

Алгоритм представляет собой метод статистического обучения, реализованный с помощью библиотеки scikit-learn на основе языка Python. Часть кода выглядит следующим образом:


def normalization(data,tag=""):
    mean = data.mean()
    maximum = data.max()
    minimum = data.min()
    print(tag,mean,maximum,minimum)
    return (data - mean) / (maximum - minimum)

df = pandas.read_csv("index.csv")
df = shuffle(df)
df = shuffle(df)
square = df['square'].values
square = normalization(square)
areas = df['areas'].values / 5
direction = df['direction'].values / 4
price = df['price'].values
#price = normalization(price)

print(areas.shape,square.shape,direction.shape)
data = np.array([areas,square,direction])
data = data.T
train_fraction = .8
train_number = int(df.shape[0] * train_fraction)
X_train = data[:train_number]
X_test = data[train_number:]
y_train = price[:train_number]
y_test = price[train_number:]
print(np.max(price))
# model
clf = GridSearchCV(SVR(kernel='rbf', gamma=0.1),{"C": [1e0, 1e1, 1e2, 1e3], "gamma": np.logspace(-2, 2, 5)},cv=5)
#clf = GridSearchCV(LogisticRegression(),{"C":[1e0,1e1,1e2,1e3],"random_state":list(range(10))},cv=5)
#clf = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), {"alpha": [1e0, 1e1, 1e2, 1e3], "gamma": np.logspace(-2, 2, 5)},cv=5)
clf.fit(X_train,y_train)
result = clf.score(X_train,y_train)
test = clf.score(X_test,y_test)
c = clf.best_params_
y = clf.predict(X_test)
x = list(range(len(y)))
plt.subplot(2,1,1)
plt.scatter(x=x,y=y,color='r')
plt.scatter(x=x,y=y_test,color='g')
print(clf.best_params_,result,test)
deviation = y - y_test
deviation = deviation.flatten()
deviation = abs(deviation)
print(np.median(deviation))
plt.subplot(2,1,2)
plt.hist(deviation,10)
joblib.dump(clf,"model.m")
plt.show()


Полный код здесь:

https://github.com/TomorrowIsBetter/crawler/blob/master/price_prediction/train.py

Код пишется наспех и небрежно, формат кодирования недостаточно стандартизирован.

Описание модели

Кодекс в основном разделен на следующие части:

1. Предварительная обработка данных: загрузка данных, скремблирование данных, нормализация данных

2. Разделение набора данных: разделите набор данных на набор для обучения и набор для проверки.

3. Обучите модель: автоматически проверяйте лучшие гиперпараметры и обучайте модель с помощью обучающего набора.

4. Визуализация данных: визуализируйте результаты прогнозирования и распределение отклонений.


Нормализованный

Нормализация модели достигается по следующей формуле:

Tickets.WeChat.QQ.com/Yes/A8ex OL7IT…


Среди них часть категории — это необычная категория, отмеченная меткой {0,1,...,N}, которая при нормализации может быть напрямую разделена на N.

Данные установлены не по порядку

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

Если вы хотите наблюдать за эффектом, вы можете закомментировать эти две строки кода:


df = shuffle(df)
df = shuffle(df)

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

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

При этом используется метод перекрестной проверки, который делит набор данных на две части: обучающий набор и набор проверки, Фактически, когда есть много наборов данных, таких как глубокое обучение, он обычно делится на три части: обучающий набор, тестовый набор и проверочный набор.Здесь данных относительно мало, соотношение обучающего набора и проверочного набора составляет 8: 2

Тестовый эффект

Как показано на рисунке, это визуальное изображение после запуска программы:

http://img2.mukewang.com/5be42ce30001da9d06480574.jpg

Зеленый — это фактическое значение выборки, а красный — прогнозируемый результат. Как видно из приведенного выше рисунка, прогнозируемый результат все еще в порядке; на следующем рисунке показано отклонение между прогнозируемым результатом и фактическим значением, и отклонение отображается в виде гистограммы. Можно видеть, что общее отклонение представляет собой распределение со смещением влево, в основном сосредоточенное в интервале [0,500], что указывает на то, что модель достигла эффекта прогнозирования.

Суммировать

В github есть данные тренировочного набора и другие части реализации, вы можете обратиться к следующему:

https://github.com/TomorrowIsBetter/crawler

Среди них эта часть контента находится в каталоге price_prediction, а другие части — это сканер, реализованный Node.js, и веб-интерфейс, реализованный AntDesign.Если вас интересует веб-интерфейс, вы также можете узнать об этом.

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

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