“ 資料,決定了機器學習的上限;而算法,隻是盡可能逼近這個上限。”
——這句話很好的闡述了 資料 在機器學習中的重要性。
資料的特征工程
- 大部分直接拿過來的資料都是特征不明顯的、沒有經過處理的或者說是存在很多無用的資料,那麼需要進行一些特征處理,特征的縮放等等,滿足訓練資料的要求;
- 優質的特征往往描述了資料的固有結構;
- 最初的原始特征資料集可能太大,或者資訊備援,是以在機器學習的應用中,一個初始步驟就是選擇特征的子集,或建構一套新的特征集,減少功能來促進算法的學習,提高泛化能力和可解釋性;
- 特征工程的意義:更好的特征意味着
,魯棒性好(穩定性,抗幹擾能力)
,可以得到模型簡單
。更好的結果
1、 資料來源與類型
資料來源與類型
(1)來源 大部分的資料都來自已有的資料庫,如果沒有的話也可以交給很多爬蟲工程師去采集,來提供。也可以來自平時的記錄,反正資料無處不在,大都是可用的。
(2)類型
- 按照
我們可以将資料分成:機器學習的資料分類
:标稱型目标變量的結果隻在有限目标集中取值,如真與假(标稱型目标變量标稱型
);主要用于分類
:數值型目标變量則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目标變量數值型
)。主要用于回歸分析
- 按照
分布特性:資料的本身
、離散型
。連續型
2、 資料的特征抽取
資料的特征抽取
資料多數特征都不是連續變量,比如
分類
、
文字
、
圖像
等,為了對非連續變量做特征表述,需要對這些特征做數學化表述,是以就用到了
特征抽取
。
sklearn.feature_extraction
提供了特征提取的很多方法
(a) 分類
特征提取
分類
- 方法
應用并轉化映射清單X,y為目标類型fit_transform(X, y)
- 方法
将Numpy數組或scipy.sparse矩陣轉換為映射清單inverse_transform(X, [dict_type])
from sklearn.feature_extraction import DictVectorizer
onehot = DictVectorizer(sparse=True) # sparse = True轉換為sparse矩陣,預設開啟
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray() # toarray()将sparse矩陣轉換為Numpy數組
print(onehot.inverse_transform(X)) # 傳回轉換之前資料格式
print(onehot.get_feature_names()) # 傳回特征名稱
print(X, type(X))
# ===運作結果:================================================================
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'temperature': 30.0, 'city=深圳': 1.0}]
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]] <class 'numpy.ndarray'>
onehot = DictVectorizer() # sparse=True預設開啟
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===運作結果:================================================================
['city=上海', 'city=北京', 'city=深圳', 'temperature']
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0 <class 'scipy.sparse.csr.csr_matrix'>
onehot = DictVectorizer(sparse=False)
instances = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===運作結果:================================================================
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]] <class 'numpy.ndarray'>
(b) 文本
特征抽取
文本
- 文本分類是通過詞是否存在、以及詞的機率(重要性)來表示
from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = CountVectorizer()
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))
# ===運作結果:================================================================
['easy', 'is', 'life', 'like', 'python', 'short', 'such']
[[0 1 1 1 1 1 0]
[1 1 0 1 2 0 1]] <class 'numpy.ndarray'>
- TF-IDF表示詞的重要性,TfidfVectorizer會根據指定的公式将文檔中的詞轉換為機率表示
from sklearn.feature_extraction.text import TfidfVectorizer
content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = TfidfVectorizer(stop_words='english')
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))
print(vectorizer.vocabulary_)
# ===運作結果:================================================================
['easy', 'life', 'like', 'python', 'short']
[[0. 0.57615236 0.40993715 0.40993715 0.57615236]
[0.53215436 0. 0.37863221 0.75726441 0. ]] <class 'numpy.ndarray'>
{'python': 3, 'life': 1, 'short': 4, 'like': 2, 'easy': 0}