1. 程式人生 > >機器學習一個小目標——Task5

機器學習一個小目標——Task5

@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)

資料標準化

資料標準化,公式為: ( x x m e a n ) x s t d \frac{(x-x_{mean})}{x_{std}} 計算時對每個屬性/每列分別進行

from sklearn import preprocessing
zdata = preprocessing.scale(data)

資料歸一化

資料縮至0-1之間,每一行表示一個樣本,每一列表示一個特徵引數
公式為 x = x x m a x x m a x x m i n x^{'}=\frac{x-x_{max}}{x_{max}-x_{min}}

from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)