機器學習1《特征抽取,歸一化與標準化》
機器學習的數據來源:
1.大多以文件的形式儲存,csv 等。
2. 為什麽不用數據庫呢,因為會有瓶頸,可能30m 以上就不行了。
3. 數據格式不匹配, 數據庫格式是json,
4. python有pandas庫 運行速度快, 並且python的numpy庫是 真正的多線程
數據集的組成:
kaggle 特點: 1.大數據競賽平臺
2.80萬科學家, 真實數據
3. 數據量巨大
UCI 特點: 1.收錄了360個數據集
2.覆蓋科學,生活,經濟等鄰域
3.數據量幾十萬
scikit-learn 特點: 數據量小, 方便學習
數據集的結構: 特征值+目標值
工具模塊: pandas, sklearn
特征抽取
特征抽取:特征抽取對文本等數據的進行特征值話,
類 :sklean.feature_extraction 特征抽取
sklean.feature_extraction.DictVectorizer 字典數據特征值化
DictVectorizer(sparse = Ture,...) 語法
1.DictVectorizer.fit_transform(x)
x:字典或保函字典的叠代器
返回值:返回稀疏矩陣
2.DictVectorizer.inverse_tansform(x)
x: array數組,或者稀疏矩陣
返回值:轉換之前數據格式
3.DictVectorizer.get_feature_name()
返回類別名稱
4.DictVectorizer.tansform(x)
按照原先的標準轉換
eg:字典數據抽取
1 from sklearn.feature_extraction import DictVectorizer 2 ‘‘‘ 3 對字典數據特征抽取 4 feature_extraction :特征抽取 5 vectorizer : 向量化 6 7 ‘‘‘ 8 9 def dictvec(): 10 ‘‘‘ 11 字典數據抽取 12 return:spare矩陣 13 ‘‘‘ 14 dictvectorize = DictVectorizer(sparse=False) # spares 矩陣節約內存,spares 15 data = [{‘city‘: ‘北京‘, ‘weather‘: ‘rain day‘, ‘temperature‘: 100}, 16 {‘city‘: ‘江西‘, ‘weather‘: ‘rain day‘, ‘temperature‘: 200}] 17 18 dictvec_data = dictvectorize.fit_transform(data) 19 print(dictvectorize.get_feature_names()) 20 ‘‘‘ 21 [‘city=北京‘, ‘city=江西‘, ‘temperature‘, ‘weather=rain day‘] 22 ‘‘‘ 23 print(dictvec_data) 24 ‘‘‘ 25 [[ 1. 0. 100. 1.] 26 [ 0. 1. 200. 1.]] 27 ‘‘‘ 28 # 所以我們可以知道字典數據抽取是在幹什麽了: 把字典中一些類別數據,分別轉換特征 29 30 if __name__ == ‘__main__‘: 31 dictvec()特征抽取字典
文本抽取CountVecorizer
1.CountVecorizer.fit_transform(x)
取樣 這裏返回的值需要 x.toarray() 才會出現字典抽取裏面spare=False的情況
2.CountVectorizer.get_feature_name()
1 from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer # 對文本進行特征抽取 2 def count_text(): 3 ‘‘‘ 4 對文本進行特征抽取 5 6 :return:None 7 ‘‘‘ 8 Cv = CountVectorizer() 9 c1, c2 = cut_chinese() 10 resule = Cv.fit_transform([c1, c2]) 11 print(Cv.get_feature_names()) 12 print(resule.toarray()) # 將數據轉化為矩陣 13 # 由此可見我們對文本進行特征抽取的時候,他會統計某個單詞出現的次數(一個字母不統計) 14 ‘‘‘ 15 [‘but‘, ‘do‘, ‘like‘, ‘me‘, ‘not‘, ‘so‘, ‘you‘] 16 [[1 1 2 1 1 0 2] 17 [0 1 1 1 0 1 1]] 18 ‘‘‘ 19 ‘‘‘ 20 但是對於中文來說,就不滿足了,因為這個分類是需要按照空格來分類的, 21 當我們需要對中文分類時,就需要把中文加上空格的地方斷開 jieba.cut(‘人生苦短,我用python‘)返回值為詞語生成器 22 23 ‘‘‘ 24 return None對文本特征抽取
從以上代碼來看,對單個字母來說是不會分析的,而且這裏面的規則是按照空格來抽取,但是我們的漢字卻沒有空格,那麽我們要對漢字或者漢字和英文的混合版進行特征抽取的適合就需要使用jieba這個庫來自動的對我們的文本分類
import jieba def cut_chinese(): text1 = ‘可以看到成功獲取到每個詞的詞性,這對於我們對分詞結果做進一步處理很有幫助,比如只想獲取分詞結果列表中的名詞,‘ ‘那麽就可以這樣過濾‘ text2 = ‘所以很多地方很多時候生成了元組、列表、字典後,可以用 join() 來轉化為字符串‘ c_text = jieba.cut(text1) c_text2 = jieba.cut(text2) cut_text =list(c_text) cut_text2 = list(c_text2) c1 = ‘ ‘.join(cut_text) c2 = ‘ ‘.join(cut_text2) return c1, c2jieba 分詞
但是現在需求來了,我們的CountVecorizer是對文本抽取,但是我卻很難從裏面獲取信息,這個時候我們就需要Tfidf 來對文本進行特征抽取了
TfidfVectorizer 重要性(tf(詞的頻率) * idf(逆文檔頻率)) 分類機器學習的重要依據
一個詞在改文章出現頻率較高,在其他文章出現頻率較低說明該詞或短語在有很好的類別區分能力,適合用來分類
這是tfidf的作用
def tf(): zhongyaoxing = TfidfVectorizer() c1, c2 = cut_chinese() a = zhongyaoxing.fit_transform([c1, c2]) print(zhongyaoxing.get_feature_names()) print(a.toarray())
歸一化與標準化
歸一化 : 通過對原始數據進行變換,把數據映射到(0, 1)之間
X‘ = (x-min)/(max-min) X‘‘ = X‘*(mx - mi) + mi
註:作用於每一列,max為一列的最大值,min為一列的最小值, X‘‘為最終結果, mx mi 分別為指點區間值默認mx為1 mi為0(縮小的範圍默認縮小範圍0到1之間)
三個特征同等重要的時候:進行歸一化
目的: 不想讓某一個特征不會對最終結果造成更大影響
缺點: 容易受異常點影響, 因為異常點會影響 最大最小值導致整個樣本變化
所以歸一化 是有局限性的
API : from sklearn.preprocessing import MinMaxScaler
MinMaxScaler(feature_range=(0,1)) feature_range() 縮小的範圍
fit_transform
eg:
def guiyi(): ‘‘‘ 歸一化 :return:None ‘‘‘ guiyi = MinMaxScaler() x = guiyi.fit_transform([[14488, 7.153469, 1.693904], [26052, 1.441871, 0.805124], [75136, 13.146394, 0.428964]]) print(x)歸一化
標準化: 歸一化的改良(抗異常點的幹擾性強)
API: from sklearn.preprocessing import StandardScaler
StandardScaler.fit_transform(X)
X: numpy array格式數據[n_samples, n_features]
返回值: 轉換後的旋轉相同的array
StandardScaler.mean_
原始數據中每列特征的平均值
StandardScaler.std_
原始數據沒列特征的方差
要求: 具有一定的樣本數量
特點: 通過對原始數據進行變換把數據換到均值為0方差為1的範圍內
公式: X‘ = (x-mean)/σ σ:標準差
標準差是方差的算術平方根 方差(參考數據的穩定性)
方差 = (x1 - mean)^2 +(x2 - mean)^2 ...+(xn - mean)^2 /n
def biaozhun(): ‘‘‘ 標準化 :return:None ‘‘‘ bz = StandardScaler() x = bz.fit_transform([[14488, 7.153469, 1.693904], [26052, 1.441871, 0.805124], [75136, 13.146394, 0.428964]]) print(x) print(bz.mean_) # 平均值 print(bz.scale_) # 標準差標準化
對於遇到處理缺失值的時候
1.刪除 : 如果每行數據或者每列數據缺失值達到一定的比例,建議放棄整行或者整列
2.插補 : 可以通過缺失值每行或者每列 的平均值,中位數來填充
API sklearn.preprocessing.Imputer
Imputer(missing_value=‘NaN‘, strategy=‘mean‘) 用平均值來填補
Imputer.fit_transform(X)
X : numpy.array數據格式[n_samples, n_features]
返回值: 轉換後形狀相同的array
eg:
[[1, 2],
[np.nan, 2],
[3,3]]
pandas:
dropna
fillna
replace(‘?‘, np.nan)
‘‘‘
機器學習1《特征抽取,歸一化與標準化》