افزایش فروش با یادگیری ماشین

چگونه ما از پردازش زبان طبیعی برای واجد شرایط بودن استفاده کنیم

در این پست وبلاگ من توضیح می دهیم که چگونه ما با آموزش الگوریتم یادگیری ماشینی برای پیش بینی کیفیت محصولات ما براساس توضیحات شرکت ، روند فروش خود را در Xeneta موثرتر می کنیم.

اگر می خواهید اسکریپت را فوراً بررسی کنید ، به GitHub بروید و در صورت توسعه مداوم ، پیشرفت های پیشنهادی را ارائه دهید.

مشکل

این کار با درخواست نماینده توسعه تجارت ، ادوارد آغاز شد ، که از انجام کار خسته کننده عبور از ورق های بزرگ اکسل پر از نام شرکت ها ، خسته شده بود ، و سعی داشت مشخص کند با کدام یک از آنها باید ارتباط برقرار کنیم.

نمونه ای از لیستی از شرکتهای بالقوه برای تماس با شرکت sec.gov

این نوع پیش فروش صلاحیت فروش می تواند ساعت ها طول بکشد ، زیرا نماینده فروش را مجبور می کند تا بفهمد که هر یک از شرکت ها چه کاری انجام می دهد (به عنوان مثال از طریق مطالعه در مورد آنها در LinkedIn) ، تا بتواند حدس و شایستگی لازم را در این مورد داشته باشد یا خیر. شرکت مناسب برای برنامه SaaS ما است.

و چگونه حدس می زنید؟ برای درک این موضوع ، ابتدا باید بدانید که چه کاری انجام می دهیم:

در اصل ، Xeneta به شرکتهایی که ظروف حمل می کنند با ارائه اطلاعات بازار حمل و نقل دریایی کمک می کند تا پتانسیل پس انداز را کشف کنند.
این مشتری در هزینه های حمل و نقل دریایی خود 748K USD پتانسیل صرفه جویی در قیمت متوسط ​​خود را برای صرفه جویی در بازار به دست آورد.

به طور خاص ، اگر شرکت شما سالانه بالای 500 کانتینر حمل می کند ، احتمالاً با استفاده از Xeneta پتانسیل صرفه جویی قابل توجهی را کشف خواهید کرد ، زیرا ما می توانیم دقیقاً به شما بگوییم که در چه بالاتر از قیمت متوسط ​​بازار پرداخت می کنید.

این ویجت نرخ قراردادی مشتریان (خط بنفش) را با میانگین بازار (نمودار سبز) برای 20 کانتینر پا از چین تا اروپای شمالی مقایسه می کند.

این بدان معنی است که مشتریان هدف ما بسیار متفاوت از یکدیگر هستند ، زیرا تنها مخرج مشترک آنها این است که آنها تا حدودی در حمل و نقل دریایی درگیر هستند. در اینجا چند نمونه از دسته بندی های شرکت ها که مورد نظر ما قرار گرفته است:

  • اتومبیل
  • حمل و نقل حمل و نقل
  • مواد شیمیایی
  • مصرف کننده و خرده فروشی
  • کالاهای کم درآمد

فرضیه

گرچه طیف گسترده ای از مشتریان هنگام یافتن سؤالات چالشی را نشان می دهند ، ما به طور معمول قادر هستیم با خواندن توضیحات شرکت خود ، شرکتی مورد علاقه Xeneta باشد ، زیرا اغلب حاوی نکات مربوط به این است که آیا آنها در ارسال چیزها نقش دارند یا خیر. سراسر دنیا.

این باعث شد ما فکر کنیم:

با توجه به توضیحات شرکت ، می توانیم الگوریتمی را آموزش دهیم که آیا مشتری بالقوه Xeneta است یا خیر؟

در این صورت ، این الگوریتم می تواند به عنوان صرفه جویی در زمان فروش برای تیم فروش اثبات شود ، زیرا تقریبا می تواند ورق های اکسل را قبل از شروع دستیابی به صلاحیت هدایت ، مرتب سازی کند.

توسعه

با شروع کار بر روی این موضوع ، سریع فهمیدم که بخشی از یادگیری ماشین تنها مشکلی نیست. ما همچنین برای دستیابی به توضیحات شرکت به روشی نیاز داشتیم.

ما خزنده وب سایت های شرکت ها را در نظر گرفتیم و بخش About About ما را واگذار کردیم. اما این بوی یک فعالیت کثیف ، غیرقابل پیش بینی و وقت گیر می داد ، بنابراین ما به دنبال یافتن API برای استفاده به جای آن بودیم. بعد از جستجو ، ما FullContact را کشف کردیم که دارای API شرکت است که توضیحات میلیون ها شرکت را برای شما فراهم می کند.

با این حال ، API آنها فقط آدرس اینترنتی شرکت را به عنوان ورودی می پذیرد ، که بندرت در برگه های اکسل ما وجود دارد.

بنابراین ما مجبور شدیم راهی برای به دست آوردن آدرس اینترنتی پیدا کنیم که باعث شد ما در جریان کار زیر قرار بگیریم:

  • استفاده از API Google برای گوگل نام شرکت (هک شده ، می دانم ...)
  • نتیجه جستجو را حلقه کنید و به احتمال زیاد صحیح URL را پیدا کنید
  • برای جستجوی API FullContact از این URL استفاده کنید

در اینجا هر مرحله ضرر وجود دارد ، بنابراین ما می خواهیم روش بهتری برای انجام این کار بیابیم. با این حال ، این به اندازه کافی خوب عمل کرد تا ایده را آزمایش کند.

مجموعه داده

با آماده شدن این اسکریپت ها ، قدم بعدی ایجاد مجموعه داده های آموزشی ما بود. نیاز به حداقل 1000 شرکت واجد شرایط و 1000 شرکت رد صلاحیت شده بود.

دسته اول آسان بود ، زیرا می توانستیم لیستی از 1000 کاربر Xeneta را از SalesForce صادر کنیم.

یافتن 1000 رد صلاحیت ، هرچند کمی سخت تر بود ، زیرا ما شرکت هایی را که از تماس با آنها اجتناب کرده ایم ، پیگیری نمی کنیم. بنابراین ادوارد بطور دستی 1000 شرکت را رد صلاحیت کرد.

تمیز کردن داده ها

با انجام این کار ، نوبت به نوشتن اسکریپت پردازش زبان طبیعی رسید ، و مرحله اول تمیز کردن توضیحات ، زیرا آنها کاملاً کثیف هستند و حاوی اطلاعات نامربوط زیادی هستند.

در مثالهای زیر ، من هر یک از تکنیک های تمیز کردن را که در حال حاضر استفاده می کنیم ، خواهم دید که چگونه توضیحات خام به عنوان مجموعه ای از اعداد به پایان می رسد.

نمونه ای از توضیحات خام.

RegExp

اولین کاری که ما انجام می دهیم استفاده از عبارات منظم برای خلاص شدن از کاراکترهای غیر الفبایی است ، زیرا مدل ما فقط قادر به یادگیری کلمات خواهد بود.

description = re.sub ("[^ a-zA-Z]" "" "" توصیف)
بعد از حذف کاراکترهای غیر الفبایی.

استمر

ما همچنین کلمات را ساقه می کنیم. این به معنای کاهش تغییرات چندگانه یک کلمه به ساقه آن است. بنابراین به جای قبول کلماتی مانند تولیدکننده ، تولید ، تولید و تولید ، ما آنها را برای ساخت ساده تر می کنیم.

از nltk.stem.snowball واردات SnowballStemmer stemmer = SnowballStemmer ('انگلیسی') توضیحات = getDescription ()
توضیحات = [stemmer.stem (کلمه) کلمه در توصیف]
بعد از کلمات کلمه ای.

کلمات را متوقف کنید

سپس کلمات متوقف را با استفاده از ابزار زبان طبیعی حذف می کنیم. کلمات متوقف کلماتی هستند که اهمیت کمی برای درک مفهومی متن دارند ، از جمله ، برای ، در ، من ، آن و غیره.

از nltk.corpus وارد کردن کلمات کلیدی stopWords = تنظیم (stopwords.words ('انگلیسی')) توضیحات = getDescription ()
توضیحات = [کلمه برای کلمه در توصیف اگر کلمه ای در stopWords نیست]
بعد از حذف کلمات متوقف.

تبدیل داده ها

اما تمیز کردن و خاموش کردن داده ها در واقع به ما کمک نمی کند یادگیری ماشینی را انجام دهیم ، زیرا ما نیز نیاز داریم توضیحات را به چیزی که دستگاه می فهمد تبدیل کنیم ، یعنی عدد.

کیف کلمات

به همین منظور ، ما از رویکرد Bag Words (BoW) استفاده می کنیم. اگر با BoW آشنایی ندارید ، توصیه می کنم این آموزش Kaggle را مطالعه کنید.

BoW یک تکنیک ساده برای تبدیل عبارات متن به بردار است ، جایی که هر مورد در بردارها یک کلمه خاص را نشان می دهد. CountVectorizer Scikit یادگیری روش فوق العاده ای برای انجام این کار به شما می دهد:

از sklearn.feature_extraction.text واردات CountVectorizer
vectorizer = CountVectorizer (آنالایزر = 'کلمه' ، max_features = 5000) vectorizer.fit (train_data) vectorized_training_data = vectorizer.transform (train_data)

پارامتر max_features به vectorizer می گوید که چند کلمه را می خواهید در واژگان ما داشته باشید. در این مثال ، بردار شامل 5000 کلمه است که اغلب در مجموعه داده های ما اتفاق می افتد و بقیه آنها را رد می کند.

نمونه ای از وکتور کیف کوچک کلمات (35 مورد). (موارد ما 5K است).

تحول Tf-idf

سرانجام ، ما همچنین یک تبدیل tf-idf را اعمال می کنیم ، که برای فرکانس اسناد معکوس فرکانس مدت کوتاه است. این تکنیکی است که اهمیت کلمات مختلف را در اسناد شما تنظیم می کند.

به طور خاص ، tf-idf کلماتی را که اغلب در یک توصیف (فرکانس اصطلاح) رخ می دهند تأکید می کند ، در حالی که کلمات را تأکید می کند که اغلب در کل مجموعه داده ها (فرکانس سند معکوس) رخ می دهد.

از sklearn.feature_extraction.text واردات TfidfTransformer tfidf = TfidfTransformer (هنجار = 'l1')
tfidf.fit (vectorized_training_data) tfidf_veectorized_data = tfidf.transform (vectorized_training_data)

مجدداً ، scikit Learn با فراهم کردن tf-idf از جعبه روز ، موجب صرفه جویی در روز می شود. به سادگی مدل را با داده های آموزش برداری شده خود متناسب کنید و سپس از روش تبدیل برای تبدیل آن استفاده کنید.

بردار بعد از اعمال tf-idf. (بابت قالب بندی بد متاسفم)

الگوریتم

پس از تمیز کردن ، برداری و تبدیل همه داده ها ، در نهایت می توانیم برخی از یادگیری های دستگاه را انجام دهیم که یکی از ساده ترین قسمت های این کار است.

ابتدا داده ها را به 70٪ داده های آموزش و 30٪ داده های آزمایش تقسیم کردم و سپس با دو الگوریتم یادگیری scikit شروع کردم: Random Forest (RF) و K نزدیکترین همسایگان (KNN). به سرعت مشخص شد که RF از KNN بهتر عمل می کند ، زیرا اولی به سرعت به بیش از 80٪ دقت رسید در حالی که دومی در 60٪ باقی مانده است.

متناسب کردن مدل Learn scikit بسیار ساده است:

def runForest (X_train، X_test، Y_train، Y_test): forest = RandomForestClassifier (n_estimators = 100) Forest = Forest.fit (X_train، Y_train) نمره = Forest.score (X_test، Y_test) امتیاز بازگشت
Forest_score = runForest (X_train ، X_test ، Y_train ، Y_test)

بنابراین من با RF ادامه دادم تا ببینم چقدر می توانم با تنظیم پارامترهای زیر دقت را افزایش دهم:

  • واژگان: تعداد کلمات CountVectorizer در واژگان شامل چند کلمه است (در حال حاضر 5K)
  • Gram Range: اندازه عباراتی که باید در Bag Words درج شود (در حال حاضر 1-3 ، معنی تا 3 عبارت "کلمه")
  • تخمین گرها: مقدار تخمینگرها در جنگل تصادفی (در حال حاضر 90)

با تنظیم این پارامترها ، این الگوریتم به دقت 86.4٪ در مجموعه داده های تست می رسد و در واقع شروع به کار شدن برای تیم فروش ما می کند.

راه پیش رو

با این حال ، فیلمنامه به هیچ وجه تمام نشده است. راه های زیادی برای بهبود آن وجود دارد. به عنوان مثال ، الگوریتم به احتمال زیاد نسبت به نوع توصیفاتی که در حال حاضر در داده های آموزشی خود داریم تعصب داریم این ممکن است هنگام آزمایش آن بر روی داده های دنیای واقعی تبدیل به گردن بطری عملکرد شود.

در اینجا فعالیتهایی وجود دارد که ما می خواهیم در جاده پیش رو انجام دهیم:

  • دریافت اطلاعات بیشتر (ضبط کردن ، API های دیگر ، بهبود نظافت داده ها)
  • انواع دیگر تبدیل داده ها را آزمایش کنید (به عنوان مثال word2vec)
  • الگوریتم های میلی لیتر دیگر (مثل شبکه های عصبی) را آزمایش کنید

اگر می خواهید پیشرفت را دنبال کنید ، مرتباً به GitHub فشار می آوریم. و در صورت داشتن هر چیزی که می خواهید اضافه کنید ، احساس راحتی کنید.

به سلامتی،

هر هارالد بورگن

ممنون از خواندن! ما Xeneta هستیم - پیشروترین بستر اطلاعاتی حمل و نقل دریایی در جهان. ما همیشه به دنبال ذهن های روشن هستیم تا به ما بپیوندید ، بنابراین اگر علاقه دارید به وب سایت ما بروید!

می توانید ما را در توییتر و متوسط ​​دنبال کنید.