02 特征工程和文本特征提取
數據集的構成
數據存放形式
- CSV 文件
- mysql: 性能瓶頸,讀取速度; 格式不符合機器學習的格式
- pandas:讀取工具
- numpy為什么讀取速度快:
- 動態語言
- 全局解釋性鎖 GIL : 釋放了 (GIL數據安全),真正的多線程
可用的數據集
- Kaggle : 大數據競賽平台、真實數據、數據量大
- UCI: 數據集覆蓋科學、生活、經濟等領域
- Scikit-learn: 數據量小,方便學習
數據集的結構組成
- 結構: 特征值 + 目標值
特征工程的定義
特征工程是什么?
特征工程:將原始數據轉換為更好地代表預測模型的潛在問題的特征的過程,從而提供了對未知數據的預測准確性。
- 很大程度上影響最后模型的精度
數據中對特征的處理
- Pandas: 數據讀取方便,基本的處理格式的工具
- DataFrame - 缺失值,數據處理
- 機器學習:重復值不需要進行處理
- Sklearn: 對特征進行處理提供強大的接口
- Python機器學習工具,包含許多知名算法的實現
- 豐富的API
數據的特征抽取
定義:
- 特征抽取是對文本等數據進行特征值化
- 特征值化:讓計算機更好的了解數據
Sklearn 特征抽取API (Sklearn.feature_extraction)
字典特征抽取
- sklearn.feature_extraction.DictVectorizer
- 把字典中的一些類別數據,分別進行轉換成特征;數值型(浮點型)不會進行轉化。
- 數組形式,有類別的這些特征,先要轉換字典數據
- fit_transform (直接接收字典)
from sklearn.feature_extraction import DictVectorizer
def dictver():
"""
字典數據抽取
:return:None
"""
# 實例化
dict = DictVectorizer(sparse=False)
# 調用fit_transform
data = dict.fit_transform(
[{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(dict.get_feature_names())
print(dict.inverse_transform(data))
print(data)
return None
if __name__ == '__main__':
dictver()
2. sparse矩陣 - 方便節約內存
- (0,1)- 行列坐標 ; 1.0 - 值
3. One-hot 編碼
- 每個類別生成一個布爾列,這些列中只有一列可以為每個樣本取值1,便於機器學習數值分析。
- 避免對每個類別生成編碼是,1,2,3這種的會存在大小關系。
### 文本的特征抽取(數量)
- sklearn.feature_extraction.text.CountVectorizer
- 文本分類,情感分析
- 對於單個英文字母不統計:不反應主題,沒有情感依據
1. 英文文本特征抽取
```python
def countvec():
"""
對文本進行特征值化
:return:None
"""
cv = CountVectorizer()
data = cv.fit_transform(['life is short, i like python','life is too long, i dislike python'])
print(cv.get_feature_names())
# print(cv.inverse_transform(data))
print(data.toarray())
return None
if __name__ == '__main__':
countvec()
- 統計所有文章當中所有的詞,重復的只看做一次
- 對每篇文章,在詞的列表里面進行統計每個詞出現的次數
- 單個字母不統計
- 中文文本
- 需要對中文進行分詞才能詳細的進行特征值化
- 不支持單個中文字
- 使用 jieba這個模塊 - jieba.cut('我是一個好程序員')
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cutword():
"""
中文字分割
:return: c1, c2, c3
"""
con1 = jieba.cut('今天很殘酷,明天更殘酷,后天很美好,'
'但絕對大多數是死在明天晚上,所以每個人不要放棄今天')
con2 = jieba.cut('我們看到的從很遠星系來的光是在幾百萬年前發出的,'
'這樣當我們看到宇宙時,我們是在看它的過去')
con3 = jieba.cut('如果只用一種方式了解某樣事物,你就不會真正的了解它。'
'了解事物真正含義的秘密取決於如何將其與我們所了解的事物相聯系')
# 轉換成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表轉換成字符串
# join(iterable) 以指定字符串作為分隔符,將content1中所有元素合並成一個新的字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
cv = CountVectorizer() # 實例化
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()
文本特征抽取(語義)
- tf - idf (tf * idf) 重要性程度
- tf: term frequency (詞的頻率)
- idf: inverse document frequency (逆文檔頻率) log(總文檔數量/該詞出現的文檔數量)
-
TF-IDF: 如果某個詞或者短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認為此詞或短語具有很好的類別區分能力,適合用來分類。
-
sklearn.feature_extraction.text.TfidfVectorizer
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
def cutword():
"""
中文字分割
:return: c1, c2, c3
"""
con1 = jieba.cut('今天很殘酷,明天更殘酷,后天很美好,'
'但絕對大多數是死在明天晚上,所以每個人不要放棄今天')
con2 = jieba.cut('我們看到的從很遠星系來的光是在幾百萬年前發出的,'
'這樣當我們看到宇宙時,我們是在看它的過去')
con3 = jieba.cut('如果只用一種方式了解某樣事物,你就不會真正的了解它。'
'了解事物真正含義的秘密取決於如何將其與我們所了解的事物相聯系')
# 轉換成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表轉換成字符串
# join(iterable) 以指定字符串作為分隔符,將content1中所有元素合並成一個新的字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
tf = TfidfVectorizer() # 實例化
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()