
تصوير دوغان أرنيت في بوسطن غلوب
هل ما زلت تبحث عن شقة جديدة؟ هل أنت مستعد لإجراء المحاولة الأخيرة؟ إذا كان الأمر كذلك - اتبعني وأريك كيفية الوصول إلى خط النهاية.
مقدمة قصيرة والمراجع
هذا هو الجزء الثالث من الدورة الموجهة لشرح كيف يمكن أن تجد شقة الأمثل في سوق العقارات. بعبارة قليلة الفكرة الرئيسية - ابحث عن أفضل عرض بين الشقق في يكاترينبرج ، حيث عشت من قبل. لكنني أعتقد أن نفس الفكرة يمكن اعتبارها في سياق مدينة أخرى.
إذا لم تكن قد قرأت الأجزاء السابقة ، فسيكون من الجيد قراءتها Part1 و Part2 .
أيضا ، يمكنك معرفة Ipython-notebooks هناك .
يجب أن يكون هذا الجزء أقصر بكثير من السابق ، لكن الشيطان في التفاصيل.
النتائج
نتيجة لجميع الإجراءات ، حصلنا على نموذج ML (Random Forest) والذي يعمل بشكل جيد للغاية. ليست جيدة كما توقعنا (النتيجة أعلى من 87 ٪) ، ولكن بالنسبة للبيانات الحقيقية ، فهي جيدة بما فيه الكفاية. و ... اسمحوا لي أن أكون صادقا ، أن الأفكار حول النتيجة كان لها تأثير غريب على لي. كنت أرغب في الحصول على درجة أكبر ، وكانت الفجوة بين النتيجة المتوقعة والتنبؤ الحقيقي أقل من 3٪. التفاؤل الممزوج بالجشع قد ذهب إلى رأسي

اريد اكثر الذهب دقة
من المعروف على نطاق واسع ، إذا كنت ترغب في تحسين شيء ما ، فربما تكون هناك طرق معاكسة. عادةً ما يبدو الاختيار بين:
- التطور مقابل الثورة
- الكمية مقابل الجودة
- واسعة النطاق مقابل مكثفة
وبسبب عدم وجود إرادة لتغيير الخيول في منتصف الطريق ، قررت استخدام RF (Random Forest) مع إضافة بعض الميزات الجديدة.
بدا الأمر وكأنه فكرة ، "نحن بحاجة فقط إلى المزيد من الميزات" لجعل النتيجة أفضل. على الأقل هذا ما فكرت به.
في aspera ad astra (من خلال المصاعب إلى النجوم)
دعونا نحاول التفكير في الميزات ذات الصلة ، والتي قد تؤثر على سعر الشقة. هناك ميزات مثل الشرفة المسطحة أو عصر المنزل والميزات الجغرافية مثل المسافة إلى أقرب محطة مترو / حافلة. ماذا يمكن أن يكون التالي لنفس النهج مع RF؟
الفكرة رقم 1. المسافة إلى المركز
يمكننا إعادة استخدام خطوط الطول والعرض (إحداثيات مسطحة). بناء على هذه المعلومات يمكننا حساب المسافة إلى وسط المدينة. تم استخدام نفس الفكرة للمقاطعات ، وهي المسافة البعيدة عن المركز ، وأرخصها. وتخمين ما ... أنها تعمل! ليس هذا النمو الكبير ( + 1 ٪ من النتيجة) ، لكنه أفضل من لا شيء.
هناك مشكلة واحدة فقط ، والفكرة نفسها ليست منطقية بالنسبة للمناطق البعيدة. إذا كنت تعيش خارج مدينة ، فيمكنك أن تعرف أن هناك قواعد أخرى للسعر.
لن يكون التفسير سهلاً إذا استنتجنا هذا النهج.
الفكرة رقم 2. بالقرب من المترو
المترو له تأثير كبير على السعر. خاصة عندما توضع في منطقة سيرا على الأقدام. لكن معنى "مسافة المشي" غير واضح. يمكن لكل شخص تفسير هذه المعلمة بطرق مختلفة. يمكنني تعيين الحد يدويًا ، لكن زيادة النتيجة لن تتجاوز 0.2٪
في الوقت نفسه ، لا يعمل بشكل مسطح من الفكرة السابقة. لا يوجد مترو قريب.
الفكرة رقم 3. عقلانية وتوازن السوق
توازن السوق هو مزيج من الطلب والعرض. تحدث آدم سميث عن ذلك. بالطبع ، يمكن المبالغة في السوق. لكن بشكل عام ، هذه الفكرة تعمل بشكل جيد. على الأقل للمنازل التي في عملية البناء.
بمعنى آخر - كلما زاد عدد المتنافسين لديك ، تقل احتمالية أن يقوم الناس بشراء شقتك (حيث تساوي الأشياء الأخرى). وهذا ينتج افتراضًا - "إذا وضعت حولي حولي شققًا أخرى ، فأنا بحاجة إلى خفض سعر الحصول على المزيد من المشترين".
وهذا يبدو وكأنه استنتاج منطقي ، أليس كذلك؟
لذلك عدت شقق مماثلة بالقرب من كل منها ، في نفس المنزل وفي حدود دائرة نصف قطرها 200 متر. تم اتخاذ التدابير لتاريخ البيع. ما النتيجة التي تتوقع أن تأخذها؟ فقط 0.1 ٪ على التحقق من صحة الصليب. حزين ولكن صحيح.
إعادة التفكير
الإقلاع عن التدخين ... في بعض الأحيان لاتخاذ خطوة إلى الوراء لاتخاذ خطوتين إلى الأمام.
- شخص حكيم مجهول
حسنًا ، الهجوم المباشر لا يعمل. لننظر في هذا الموقف من زاوية أخرى.
لنفترض أنك الشخص الذي يريد شراء شقة بالقرب من النهر بعيدًا عن المدينة الصاخبة. لديك ثلاثة أنواع من الإعلانات متشابهة مع بعضها البعض وتسعيرها (أكثر أو أقل). لا تمنحك المقاييس الرسمية التي تصف المسطحة أي شيء عن البيئة ، فهي مقاييس فقط على الشاشة. ولكن هناك شيء مهم.

وصف شقة هي فرصة رائعة.
يمكن أن يوفر الوصف المسطح كل ما تحتاجه. يمكن أن يحكي لك قصة عن شقة وعن الجيران والفرص المذهلة المتعلقة بمكان المعيشة المحدد هذا. وفي وقت ما وصف واحد يمكن أن يكون أكثر منطقية من الأرقام المملة.
ولكن في الحياة الحقيقية يختلف قليلاً عن توقعاتنا. دعني أريك ما ستنجح / لن تنجح ولماذا.
ما لن ينجح ولماذا؟
التوقعات - "قف! يمكنني محاولة تصنيف النص والعثور على شقق" جيدة "و" سيئة ". سأستخدم نفس الطريقة التي تستخدم عادة لتحليل المعنويات".
الواقع - "لا ، لن تفعل ذلك. فالناس لا يكتبون شيئًا سيئًا ضد شقتهم. يمكن أن يكون هناك تلميع لموقف أو كذب حقيقي"
التوقعات - "حسنًا. بعد ذلك يمكنني محاولة العثور على أنماط والعثور على الجمهور المستهدف لشقة. على سبيل المثال ، يمكن أن يكون كبار السن أو الطلاب".
الواقع - "لا ، لن تفعل ذلك. في بعض الأحيان ، هناك إعلان واحد يذكر ذكرًا لمختلف الأعمار والفئات الاجتماعية ، إنه مجرد تسويق"
ما ربما ستعمل ولماذا
بعض الكلمات الرئيسية - هناك كلمات تشير إلى أشياء محددة أو لحظات متعلقة بمسطح. على سبيل المثال ، عندما يكون الاستوديو ، سيكون السعر أقل. بشكل عام ، الأفعال عديمة الفائدة ، لكن الأسماء والأحوال يمكن أن تعطي سياقًا أكبر.
المصدر البديل للمعلومات - استخدام وصف لملء القيم الفارغة أو غير الصحيحة. في بعض الأحيان ، يحتوي الوصف على معلومات أكثر من الميزات الرسمية للإعلان.
أظن أنه يقوم على الكسل البشري لملء الحقول غير المطلوبة مثل "الشرفة". يبدو وضع كل شيء في الوصف فكرة أفضل
أقوم بتخطي وصف العملية النموذجية للرمز / الاستئصال / الاستئصال. كذلك ، أعتقد أن هناك مؤلفين قادرين على وصفه أفضل مني.
على الرغم من أنني أعتقد أنه يجب أن يكون هناك ذكر لمجموعة الأدوات المستخدمة لاستخراج الميزات. باختصار ، يبدو.

فصل-> مطابقة بواسطة جزء من الكلام
بعد المعالجة المسبقة لنص الإعلان ، حصلت على مجموعة من الكلمات الروسية مثل هذه.

يتم وضع النص الأصلي https://pastebin.com/Pxh8zVe3
لقد حاولت استخدام النهج من Word2Vec ، لكن لم يكن هناك قاموس خاص للشقق والإعلانات ، لذا تبدو الصورة العامة غريبة

المسافة بين الكلمات لا تناسب التوقعات
لذلك ظللت الأمر بسيطًا قدر الإمكان وقررت إنشاء عدة أعمدة جديدة لمجموعة البيانات
أقل قليلا محادثة ، أكثر قليلا العمل
حان الوقت للحصول على أيدينا القذرة والقيام ببعض الأشياء العملية. اكتشف ميزات جديدة تم فصل العديد من العوامل المهمة عن طريق التأثير على السعر.
تأثير إيجابي
- الأثاث - في بعض الأحيان يمكن أن يترك الناس سرير ، غسالة وهلم جرا.
- فاخرة - شقق بأشياء فخمة مثل الجاكوزي أو مقصورة داخلية حصرية
- التحكم بالفيديو - يجعل الناس يشعرون بالأمان ، وغالبًا ما يعتبرونه ميزة
تأثير سلبي
- المسكن - نعم ، أحيانًا يكون مسطحًا في مسكن. ليست شعبية جدا ، ولكن أرخص بكثير من شقة متوسطة
- الاندفاع - عندما يندفع الناس لبيع شقتهم عادة يكونون مستعدين لخفض السعر.
- الاستوديو - كما قلت من قبل - أنها أرخص من نظائرها في الشقق.
دعونا جمعها في شيء عالمي
df3 = pd.read_csv('flats3.csv') positive_impact = ['', 'luxury',''] negative_impact = ['studio', 'rush','dorm'] geo_features = ['metro','num_of_stops_1km','num_of_shops_1km','num_of_kindergarden_1km', 'num_of_medical_1km','center_distance'] flat_features=['total_area', 'repair','balcony_y', 'walls_y','district_y', 'age_y'] competitors_features = ['distance_200m', 'same_house'] cols = ['cost'] cols+=flat_features cols+=geo_features cols+=competitors_features cols+=positive_impact cols+=negative_impact df3 = df3[cols]
التأثير العام
انها مجرد مزيج من الميزات السلبية والإيجابية. في البداية ، لكل شقة ، تساوي 0. على سبيل المثال ، سيظل للاستوديو الذي يتحكم في الفيديو تأثير عام يساوي 0 ( 1 [إيجابي] –1 [سالب] = 0 )
df3['impact'] = 0 for i, row in df3.iterrows(): impact = 0 for positive in positive_impact: if row[positive]: impact+=1 for negative in negative_impact: if row[negative]: impact-=1 df3.at[i, 'impact'] = impact
حسنًا ، لدينا بيانات وميزات جديدة وهدف قديم مع 10٪ من الخطأ المتوسط للتنبؤ. القيام ببعض العمليات النموذجية كما فعلنا من قبل
y = df3.cost X = df3.drop(columns=['cost']) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
النهج القديم (النمو الشامل للميزات)
سنقوم بعمل نموذج جديد يعتمد على الأفكار القديمة
data = [] max_features = int(X.shape[1]/2) for x in range(1,20): regressor = RandomForestRegressor(verbose=0, n_estimators=128, max_features=max_features, max_depth=x, random_state=42) model = regressor.fit(X_train, y_train) score = do_cross_validation(X, y, model) data.append({'max_depth':x,'score':score}) data = pd.DataFrame(data) f, ax = plot.subplots(figsize=(10, 10)) sns.lineplot(x="max_depth", y="score", data=data) max_result = data.loc[data['score'].idxmax()] ax.set_title(f'Max score - {max_result.score}\nDepth {max_result.max_depth} ')
وكانت النتيجة قليلا ... غير متوقع.

92 ٪ هي نتيجة ساحقة. أعني ، أن أقول إنني صدمت سيكون بخس.
ولكن لماذا عملت بشكل جيد؟ دعونا نلقي نظرة على الميزات الجديدة.
regressor = RandomForestRegressor(random_state=42, max_depth=max_result.max_depth, n_estimators=128, max_features=max_features) rf3 = regressor.fit(X_train, y_train) feat_importances = pd.Series(rf3.feature_importances_, index=X.columns) feat_importances.nlargest(X.shape[1]).plot(kind='barh')

أهمية جميع الميزات لدينا نموذج
لا تعطي الأهمية معلومات حول مساهمة الميزات (هذه قصة مختلفة) ، إنها تُظهر فقط كيفية استخدام النموذج النشط لميزة أو أخرى. ولكن بالنسبة للوضع الحالي ، فإنه يبدو غني بالمعلومات. بعض الميزات الجديدة أكثر أهمية من الميزات السابقة ، والبعض الآخر عديم الفائدة تقريبًا.
نهج جديد (العمل المكثف مع البيانات)
حسنًا ... تم تجاوز خط النهاية ، وتحققت النتيجة. هل يمكن أن يكون أفضل؟
إجابة قصيرة - "نعم ، يمكن"
- أولاً ، يمكننا تقليل عمق الشجرة. وسوف يؤدي إلى وقت أصغر للتدريب والتنبؤ كذلك.
- ثانياً ، يمكننا زيادة درجة التنبؤ قليلاً.
في كلتا اللحظات ، سوف نستخدم XGBoost . في بعض الأحيان يفضل الناس استخدام معززات أخرى مثل LightGBM أو CatBoost ، ولكن رأيي المتواضع - الرأي الأول جيد بما فيه الكفاية عندما يكون لديك الكثير من البيانات ، والثاني أفضل إذا كنت تعمل مع المتغيرات الفئوية. وكمكافأة - يبدو XGBoost أسرع
from xgboost import XGBRegressor,plot_importance data = [] for x in range(3,10): regressor = XGBRegressor(verbose=0, reg_lambda=10, n_estimators=1000, objective='reg:squarederror', max_depth=x, random_state=42) model = regressor.fit(X_train, y_train) score = do_cross_validation(X, y, model) data.append({'max_depth':x,'score':score}) data = pd.DataFrame(data) f, ax = plot.subplots(figsize=(10, 10)) sns.lineplot(x="max_depth", y="score", data=data) max_result = data.loc[data['score'].idxmax()] ax.set_title(f'Max score-{max_result.score}\nDepth {max_result.max_depth} ')

والنتيجة أفضل من السابقة.
بالطبع ، هذا ليس الفرق الكبير بين Random Forest و XGBoost. ويمكن استخدام كل منها كأداة جيدة لحل مشكلتنا بالتنبؤ. الأمر متروك لك.
استنتاج
هل تحققت النتيجة؟ بالتأكيد نعم.
الحل متاح هناك ويمكن استخدامه لأي شخص مجانًا. إذا كنت مهتمًا بتقييم شقة باستخدام هذا النهج ، يرجى عدم التردد في الاتصال بي.
كما النموذج الأولي وضعها هناك
شكرا للقراءة! .