"""
可以嘗試修改/除錯/公升級的部分是:
文字預處理步驟: 你可以使用很多不同的方法來使得文字資料變得更加清潔
更好的回歸模型: 根據之前的課講的ensemble方法,把分類器提公升到極致
版本1.0
日期:10.10.2019
"""import numpy as np
import pandas as pd
from sklearn.ensemble import randomforestregressor, baggingregressor
from nltk.stem.snowball import snowballstemmer
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
df_train = pd.read_csv(
, encoding=
"iso-8859-1"
)df_test = pd.read_csv(
, encoding=
"iso-8859-1"
)df_desc = pd.read_csv(
)# 描述資訊
# 上下連線訓練集和測試集
df_all = pd.concat(
(df_train, df_test)
, axis=
0, ignore_index=
true
)# ignore_index=true忽略原索引,生成新索引
# 根據product_uid左右合併產品介紹
df_all = pd.merge(df_all, df_desc, how=
'left'
, on=
'product_uid'
)#--------------------------------- 文字預處理 -----------------------------------
# 可以選用各種你覺得靠譜的預處理方式:去掉停止詞,糾正拼寫,去掉數字,去掉各種emoji,等等)
# 這裡只用snowballstemmer,詞幹抽取
stemmer = snowballstemmer(
'english'
)def
str_stemmer
(s):
""" :param s: 字元格式的字元
:return: 詞幹抽取後的字元
"""return
" ".join(
[stemmer.stem(word)
for word in s.lower(
).split()]
)# 將三組object進行詞幹抽取
df_all[
'search_term'
]= df_all[
'search_term'].
map(
lambda x: str_stemmer(x)
)df_all[
'product_title'
]= df_all[
'product_title'].
map(
lambda x: str_stemmer(x)
)df_all[
'product_description'
]= df_all[
'product_description'].
map(
lambda x: str_stemmer(x)
)#----------------------------------- 自製文字特徵 -------------------------------------
df_all[
'len_of_query'
]= df_all[
'search_term'].
map(
lambda x:
len(x.split())
).astype(np.int64)
# 計算str1有多少個重合在str2裡面
defstr_common_word
(str1, str2)
:print
(str1.head())
return
sum(
int(str2.find(word)
>=0)
for word in str1.split())
df_all[
'commons_in_title'
]= df_all.
(lambda x:
str_common_word(x[
'search_term'
], x[
'product_title'])
, axis=1)
df_all[
'commons_in_desc'
]= df_all.
(lambda x:
str_common_word(x[
'search_term'
], x[
'product_description'])
, axis=1)
#---------------------------------------------
# 搞完之後,我們把不能被『機器學習模型』處理的column給drop掉
df_all = df_all.drop(
['search_term'
,'product_title'
,'product_description'
], axis=1)
# 重塑訓練/測試集
# 搞完一圈預處理之後,我們讓資料重回原本的樣貌
# 分開訓練和測試集
df_train = df_all.loc[df_train.index]
df_test = df_all.loc[df_train.shape[0]
:]# 記錄下測試集的id
# 留著上傳的時候 能對的上號
test_ids = df_test[
'id'
]# 分離出y_train
y_train = df_train[
'relevance'
].values # .values 意思是轉化numpy
x_train = df_train.drop(
['id'
,'relevance'
], axis=1)
.values
x_test = df_test.drop(
['id'
,'relevance'
], axis=1)
.values
#-------------------------- 建立模型 --------------------------------------
params =[2
,6,7
,9]# 每棵決策樹的最大深度,可以給出更多的引數值進行篩選
test_scores =
for param in params:
# n_estimators用於指定隨機森林所包含的決策樹個數
# max_depth每棵決策樹的最大深度
classfier = randomforestregressor(n_estimators=
30, max_depth=param)
# cv:把資料分成5份,5折交叉驗證
test_score = np.sqrt(
-cross_val_score(classfier, x_train, y_train, cv=
5, scoring=
'neg_mean_squared_error'))
)plt.plot(params, test_scores)
plt.title(
"param vs cv error"
)# 大概6~7的時候達到了最優解
# 用上面最優解深度6這個樹深引數,跑測試集
rf = randomforestregressor(n_estimators=
30, max_depth=6)
rf.fit(x_train, y_train)
y_pred = rf.predict(x_test)
# 儲存測試集**結果
pd.dataframe(
).to_csv(
'submission.csv'
,index=
false
)
NLP關鍵詞提取
1 tf idf詞頻逆序詞頻 2 textrank 基於圖的模型,網上很多測評說它不一定強過tf idf,其實對於沒有標註資料的情況,感覺評判好壞真的很艱難。3 lda 4 word2vec 聚類 這個方法是看以為總結的,感覺具體的實施方案還是得自己實踐,不過個人覺得這個方法有點麻煩。主要流程如下 ...
NLP 關鍵詞提取演算法
一 提取關鍵字技術簡介 關鍵字提取技術一般也可以分為有監督和無監督 分別是tf idf演算法 textrank演算法和主題模型演算法 包括lsa lsi lda等 tf idf演算法 tf idf term frequency inverse document frequency,詞頻 逆文件頻次演...
NLP學習路徑(五) NLP關鍵詞提取演算法
2 tf idf演算法 無監督 tf idf演算法是一種基於統計的計算方法,常用於評估在乙個文件集中乙個詞對某份文件的重要程度。tf演算法是統計乙個詞在一篇文件 現的頻次 idf演算法是統計乙個詞在文件集的多少個文件 現,基本思想是 如果乙個詞在文件 現的次數越少,則其對文件的區分能力也就越強 要對...