機器學習——資料預處理
阿新 • • 發佈:2018-12-13
基礎
機器學習主要有兩種,監督學習和非監督學習。監督學習就是督促計算機去學習,明確告訴它目標是什麼,非監督學習是讓計算機“自學成才”,沒有設定目標,學習完告訴我你學到了什麼
1 # encoding=utf-8 2 3 from sklearn import linear_model 4 import matplotlib.pyplot as plt 5 import numpy as np 6 7 # 房屋面積與價格歷史資料(csv檔案) 8 data = np.array([[150, 6450], [200, 7450], [250, 8450], [300, 9450], [350, 11450], [400, 15450], [600, 18450]])9 # print data[:, 0].reshape(-1, 1) 10 # plt.scatter(data[:, 0], data[:, 1], color='blue') 11 # plt.show() 12 13 # 線性模型 14 # regr = linear_model.LinearRegression() 15 # 擬合 16 # regr.fit(data[:, 0].reshape(-1, 1), data[:, 1]) 17 # 直線的斜率、截距 18 # a, b = regr.coef_, regr.intercept_ 19 # print a, b 20 # plt.plot(data[:,0],regr.predict(data[:,0].reshape(-1,1)),color='red',linewidth=4)21 # plt.scatter(data[:, 0], regr.predict(data[:, 0].reshape(-1, 1)), color='red') 22 # 預測175天和800天房價資料 23 # print regr.predict(175) 24 # print regr.predict(800) 25 # plt.show()
資料預處理
匯入類庫
1 from sklearn.feature_extraction import DictVectorizer 2 from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer3 import jieba 4 from sklearn.feature_selection import VarianceThreshold 5 from sklearn.preprocessing import StandardScaler, MinMaxScaler
資料處理
字典資料抽取
程式碼
1 def dictvec(): 2 ''' 3 字典資料抽取:DictVectorizer 4 sprase:為False時生成矩陣形式 5 fit_transform:訓練資料集 6 get_feature_names:獲取特徵名,即列名或表頭 7 inverse_transform:得到每行資料中為1的資料(為1即為存在) 8 :return: 9 ''' 10 dict = DictVectorizer(sparse=False) 11 data = dict.fit_transform( 12 [{'city': '北京', 'pos': '北方', 'temperature': 100}, 13 {'city': '上海', 'pos': '南方', 'temperature': 60}, 14 {'city': '深圳', 'pos': '南方', 'temperature': 30}, 15 {'city': '重慶', 'pos': '南方', 'temperature': 70}, 16 {'city': '北京', 'pos': '北方', 'temperature': 100}]) 17 18 print(dict.get_feature_names()) 19 print(dict.inverse_transform(data)) 20 print(data) 21 return None
結果
'''
['city=上海', 'city=北京', 'city=深圳', 'city=重慶', 'pos=北方', 'pos=南方', 'temperature']
[{'city=北京': 1.0, 'pos=北方': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'pos=南方': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'pos=南方': 1.0, 'temperature': 30.0}, {'city=重慶': 1.0, 'pos=南方': 1.0, 'temperature': 70.0}, {'city=北京': 1.0, 'pos=北方': 1.0, 'temperature': 100.0}]
[[ 0. 1. 0. 0. 1. 0. 100.]
[ 1. 0. 0. 0. 0. 1. 60.]
[ 0. 0. 1. 0. 0. 1. 30.]
[ 0. 0. 0. 1. 0. 1. 70.]
[ 0. 1. 0. 0. 1. 0. 100.]]
'''
英文特徵值化
程式碼
1 def countvec(): 2 ''' 3 對文字進行特徵值化:CountVectorizer對文字中的詞可進行統計 4 排序:會按照英文常用性進行排序 5 停用:a 等無顯著特徵的詞會被停用 6 :return: None 7 ''' 8 cv = CountVectorizer() 9 data = cv.fit_transform(['this is a test test', 'we have a test']) 10 11 print(cv.get_feature_names()) 12 print(data.toarray()) 13 return None
結果
'''
['have', 'is', 'test', 'this', 'we']
[[0 1 2 1 0]
[1 0 1 0 1]]
'''
中文特徵值化
程式碼
def cutword(): # 分詞 con1 = jieba.cut('天空灰得像哭過') con2 = jieba.cut('離開你以後') con3 = jieba.cut('並沒有很自由') # 轉換成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表轉換成字串 c1 = ' '.join(content1) c2 = ' '.join(content2) c3 = ' '.join(content3) return c1, c2, c3
1 def hanzivec(): 2 ''' 3 對文字進行特徵值化:CountVectorizer對文字中的詞可進行統計 4 :return: None 5 ''' 6 c1, c2, c3 = cutword() 7 cv = CountVectorizer() 8 print(c1, c2, c3) 9 data = cv.fit_transform([c1, c2, c3]) 10 11 print(cv.get_feature_names()) 12 print(data.toarray()) 13 return None
結果
'''
天空 灰得 像 哭 過 離開 你 以後 並 沒有 很 自由
['以後', '天空', '沒有', '灰得', '離開', '自由']
[[0 1 0 1 0 0]
[1 0 0 0 1 0]
[0 0 1 0 0 1]]
'''
詞頻
程式碼
def tfidfvec(): ''' 中文特徵值化 TF(詞頻):在一篇文章中出現該詞的次數與文章中總詞數的比值,(出現次數/文章總詞數) IDF(逆向詞頻):log(文章總數/該詞出現的文章數) TF,IDF值越大說明該詞特徵越顯著 ''' c1, c2, c3 = cutword() print(c1, c2, c3) tf = TfidfVectorizer() data = tf.fit_transform([c1, c2, c3]) print(tf.get_feature_names()) print(data.toarray()) return None
結果
'''
天空 灰得 像 哭 過 離開 你 以後 並 沒有 很 自由
['以後', '天空', '沒有', '灰得', '離開', '自由']
[[0. 0.70710678 0. 0.70710678 0. 0. ]
[0.70710678 0. 0. 0. 0.70710678 0. ]
[0. 0. 0.70710678 0. 0. 0.70710678]]
'''
標準化縮放
程式碼
1 def stand(): 2 ''' 3 標準化縮放:特徵列均值為0,標準差為1 4 將資料差值很大,但變化率等相近的資料標準化,類似於橫座標是1000,2000,3000,縱座標是1,2,3 5 :return: 6 ''' 7 std = StandardScaler() 8 # data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]]) 9 data = std.fit_transform([[1., 2., 3.], [100., 200., 300.], [1000., 2000., 3000.]]) 10 print(data) 11 return None
結果
'''
[[-0.81438366 -0.81438366 -0.81438366]
[-0.59409956 -0.59409956 -0.59409956]
[ 1.40848322 1.40848322 1.40848322]]
'''
歸一化
程式碼
1 def mm(): 2 ''' 3 歸一化處理:類似於上面標準化,可以設定歸一化後的特徵值範圍 4 :return: 5 ''' 6 mm = MinMaxScaler(feature_range=(2, 3)) 7 data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) 8 print(data) 9 return None
結果
'''
[[3. 2. 2. 2. ]
[2. 3. 3. 2.83333333]
[2.5 2.5 2.6 3. ]]
'''
特徵選擇
程式碼
1 def var(): 2 ''' 3 特徵選擇-刪除低方差的特徵 4 threshold:閾值,小於設定閾值方差的特徵列將被剔除 5 注:方差小的,特徵不顯著 6 :return: 7 ''' 8 var = VarianceThreshold(threshold=1.0) 9 data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]) 10 11 print(data) 12 return None
結果
'''
[[0]
[4]
[1]]
'''