特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
特征提取
sklearn中特征抽取的API是sklearn.feature_extraction。
字典特征提取
对字典数据进行特征抽取API是sklearn.feature_extraction.DictVectorizer。
流程:实例化后,调用fit_transform 方法输入数据并进行转化。
from sklearn.feature_extraction import DictVectorizer
#字典数据进行特征抽取
def Dictvec():
#进行特征抽取实例化
dict = DictVectorizer(sparse= False)
#调用fit_transform
data = dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':160},{'city':'深圳','temperature':30}])
print(data)
print(dict.inverse_transform(data))
print(dict.get_feature_names())
return None
文本特征提取
作用:对文本数据进行特征值化
特征化文本数据的API:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer.fit_transform返回sparse矩阵,使用toarray函数进行sparse矩阵转化为array数组。
from sklearn.feature_extraction.text import CountVectorizer
#对文本进行特征值化
def Countvec():
#实例化
cv = CountVectorizer()
data = cv.fit_transform(['Life is short, I like python','Life is too long,I dislike python'])
#numpy中函数转化为数组形式toarray(),countvectorizer单个字母不统计
print(data.toarray())
print(cv.get_feature_names())
进行中文文本数据预处理使用jieba.cut()分词,返回词语生成器。
def wordcut():
data1 = jieba.cut('今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。')
data2 = jieba.cut('我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。')
data3 = jieba.cut('如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系')
l1 = list(data1)
l2 = list(data2)
l3 = list(data3)
c1 = ' '.join(l1)
c2 = ' '.join(l2)
c3 = ' '.join(l3)
return c1,c2,c3
Tf-idf
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,
并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
API:sklearn.feature_extraction.text.TfidfVectorizer
def Tfidfv():
c1,c2,c3 = wordcut()
cv = TfidfVectorizer()
data = cv.fit_transform([c1,c2,c3])
#numpy中函数转化为数组形式toarray(),countvectorizer单个字母不统计
print(data.toarray())
print(cv.get_feature_names())
特征预处理
API:sklearn.preprocessing
归一化
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
API:sklearn.preprocessing.MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
def mm():
mm = MinMaxScaler(feature_range=(3,4))
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[25,3,13,46]])
print(data)
return None
注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化
通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。
API:sklearn.preprocessing.StandardScaler
如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
from sklearn.preprocessing import StandardScaler
def stand():
std = StandardScaler()
data = std.fit_transform([[90,2,10,40],[60,4,15,45],[25,3,13,46]])
print(data)
return None
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
缺失值处理
处理方法有两种:删除、插补。
插补API:sklearn.impute.SimpleImputer
SimpleImputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
完成缺失值插补
缺失值np.nan属于float型,如果遇到特殊符号的缺失值比如df里出现’?'是缺失值可以使用df.replace("?",np.nan)进行替换
def im():
im = SimpleImputer(missing_values = np.nan,strategy = 'mean')
data = im.fit_transform([[1,2,3],[np.nan,2,5],[3,5,7]])
print(data)
return None