機器學習一個小目標——Task5
阿新 • • 發佈:2018-11-24
@TOC
任務
【任務五-特徵工程1】關於資料型別轉換以及缺失值處理(嘗試不同的填充看效果)以及你能借鑑的資料探索
遇到的問題
SVM模型訓練時一直卡住不動,【原因是資料沒有標準化或者是歸一化】
刪去無關特徵
對每一列的資料進行統計,如果這一列的資料每一個都不同,即判斷為無關特徵並且刪去。
for i in data.columns:
count = data[i].count()
if len(list(data[i].unique())) in [1,count,count-1]:
data.drop(i,axis = 1,inplace=True )
2.1 缺失值處理
填充固定值
data.fillna(0, inplace=True) #
眾數填充
考慮給某列的缺失值,填充為該列的眾數,由於眾數可能存在多個,所以pandas返回的是一個Series,而不像mean()返回的是一個值,預設取第一個眾數。(目前沒有找到一次填充完成的方法)
col.fillna(col.mode()[0], inplace=True)
一次 填充眾數完成
data = pd.read_csv(path + 'data_set/data.csv',encoding='gbk')
filter_feature = ['status'] # 過濾無用的維度
features = []
for x in data.columns: # 取特徵
if x not in filter_feature:
features.append(x)
data.fillna(data.mode(),inplace=True) # 填充眾數,該資料缺失太多眾數出現為nan的情況
features_mode = {}
for f in features:
features_mode[f] = list(data[f].dropna().mode().values)[0]
data.fillna( features_mode,inplace=True)
temp1=data.isnull()
num=(temp1 == True).astype(bool).sum(axis=1)
均值填充(可以一次填充完成)
data.fillna(data.mean(),inplace=True)
用前後資料進行填充
# 用前一個數據進行填充
data = data.fillna(method='pad')
# 用後一個數據進行填充
data = data.fillna(method='bfill')
用插值法填充
data = data.interpolate()
用每一個特徵的全域性平均值來代替無效值 (什麼是全域性平均值???)
程式碼如下:
from sklearn.preprocessing import Imputer
import numpy as np
#匯入要進行缺失值處理的資料檔案,資料檔案上面有展示
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
imp = Imputer(missing_values='NAN', strategy='mean', axis=0)
#上面'NAN'表示無效值在資料檔案中的標識是'NAN',strategy='mean'表示用全域性平均值代替無效值,axis=0表示對列進行處理
imp.fit(data)
#訓練一個缺失值處理模型
outfile = imp.transform(data)
用fancyimpute 包進行填充
這裡需要安裝fancyimpute 包
具體步驟:
conda install ecos
conda install CVXcanon
安裝visual C++
安裝tensorflow
安裝fancyimpute
更新numpy
from fancyimpute import BiScaler, KNN, NuclearNormMinimization, SoftImpute
# 用KNN進行填充
X_filled_knn = KNN(k=3).fit_transform(data)
# matrix completion using convex optimization to find low-rank solution,that still matches observed values. Slow!
#(用凸優化法求矩陣補全的低秩解,這仍然與觀測值相匹配。比較慢!————以上翻譯結果來自機器翻譯,僅供參考,)
X_filled_nnm = NuclearNormMinimization().fit_transform(data)
# Instead of solving the nuclear norm objective directly, instead induce sparsity using singular value thresholding
#(採用奇異值閾值法誘導稀疏性,而不是直接求解核範數目標————以上翻譯結果來自機器翻譯,僅供參考,)
X_filled_softimpute = SoftImpute().fit_transform(X_incomplete_normalized)
以上來源於網路,不太理解
訓練模型填充空值(fill null)的幾種方法
2.2 資料型別轉換
使用對映,把不同的非數值型別轉換成數值型別
n = set(data['id_name'])
dic = {}
for i, j in enumerate(n):
dic[j] = i
data['id_name'] = data['id_name'].map(dic)
資料標準化
資料標準化,公式為: 計算時對每個屬性/每列分別進行
from sklearn import preprocessing
zdata = preprocessing.scale(data)
資料歸一化
資料縮至0-1之間,每一行表示一個樣本,每一列表示一個特徵引數
公式為
from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)