机器学习入门
ps:材料来源于B站黑马程序员,自己整理的笔记
- 特征工程之特征提取
模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
sklearn数据集的使用
def datasets_demo():
iris = load_iris()
print("鸢尾花数据集:\n",iris)
print("数据集描述:\n",iris["DESCR"])
print("查看特征值的名字:\n",iris.feature_names)
print("查看特征值:\n",iris.data,iris.data.shape)
#数据集划分(8成作为训练集,2成作为测试集)
#使用模块sklearn.model_selection.train_test_splot(arrays.*options)
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
print("训练集的特征值如下:\n",x_train,x_train.shape)
return None
字典特征提取
def dict_demo():
data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
#1实例化一个转换器类,导入模块DictVectorizer,将导入的数据进行特征提取
# spare=True 时,返回的是散列值,对应特征在矩阵中的下标,。spare=False时,返回特征矩阵(one-hot方法)-->原本只有两个特征,现在矩阵映射出来4个特征。
#也可以使用方法toarray(),即print("data_new:\n",data_new.toarray())
transfer = DictVectorizer(sparse=False)
#2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
print("特征名字:\n",transfer.get_feature_names())
文本特征提取
def count_demo():
data = ["life is short,i like python","life is too long,i dislike python"]
#1、实例化一个转换器类
transfer = CountVectorizer()
#2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new.toarray())
print("特征名字:\n",transfer.get_feature_names())
return None
中文文本特征提取
def count_chinese_demo():
data = ["我 爱 广西师范大学","广西师范大学 欢迎 你"]
#1、实例化一个转换器类
transfer = CountVectorizer()
#2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new.toarray())
print("特征名字:\n",transfer.get_feature_names())
return None
中文文本特征提取,自动分词
def count_chinese_demo2():
#将中文文本进行分词
data = ["后来他还说叫我妈妈准备好到时候摆宴席啊,妈妈被说的一脸懵逼,然后那个叔叔说那到时候考上北大了不用请客啊。",
"哇,那得有多大的能耐啊。我真的不行啊。后来妈妈有说,清华北大也没什么啦,zjc只要考个离家里近的大学就行,有的读就行啦。"]
data_new = []
for sent in data:
data_new.append(str(cut_words(sent)))
print(data_new)
#以下类似,stop_words是选择过滤单词
transfer = CountVectorizer(stop_words=["叔叔","准备"])
data_final = transfer.fit_transform(data_new)
print("data_new:\n",data_final.toarray())
print("特征名字:\n",transfer.get_feature_names())
return None
用TF-IDF进行文章词汇重要程度分类
def tfidf_demo():
#将中文文本进行分词
data = ["后来他还说叫我妈妈准备好到时候摆宴席啊,妈妈被说的一脸懵逼,然后那个叔叔说那到时候考上北大了不用请客啊。",
"哇,那得有多大的能耐啊。我真的不行啊。后来妈妈有说,清华北大也没什么啦,"
"zjc只要考个离家里近的大学就行,有的读就行啦。"]
data_new = []
for sent in data:
data_new.append(cut_words(sent))
#1实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["叔叔","时候"])
#2调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n",data_final.toarray())
print("特征名字:\n",transfer.get_feature_names())
return None
使用最大最小值归一化数据,使用的公式在讲义里(无量钢化问题)
进行标准化时,只需将MinMaxScaler转换为StandardScaler()
def minmax_demo():
#1.获取数据//read_csv()方法可能会将制表符\t读取出来,导致失败。这时换用read_table()
data = pd.read_table("datingTestSet2.txt")
# data = data.iloc[:, :3]
print("data:\n",data)
#2.实例化一个转换器类,feature_range决定最后的归元范围
transfer = MinMaxScaler(feature_range=[2,3])
#3.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
删除低方差特征—特征选择
特征之间相关系数的计算,导包:from scipy.stats import pearsonr
def variance_demo():
#1.导入数据
data = pd.read_csv("factor_returns.csv")
#2.实例化转换器类,该threshold将方差范围内的特征去掉,留下尽量不相关的特征
transfer = VarianceThreshold(threshold=5)
#3.调用fit_transform
data_new = transfer.fit_transform(data.iloc[:, 1:10])
print("data_new:\n",data_new)
#计算两个特征之间的相关性,即计算相关系数
r1 = pearsonr(data["pe_ratio"],data["pb_ratio"])
print("相关系数\n:",r1)
第一章总结
分类算法
KNN算法
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
#1.获取数据
iris= load_iris()
#2.划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
#3.特征工程:标准化.-->fit计算每一列的平均值和标准差,transform()将fit计算出的结果(平均值和标准差)带入公式(x-mean)/std进行最终的转换
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#4.KNN算法预估器,估计器estimator包含了sklearn中所有的算法
#1)实例化一个estimator类
estimator = KNeighborsClassifier(n_neighbors=3)
#2)调用estimator中的fit进行计算,参数是训练集的特征值和目标值,即进行机器学习的训练
estimator.fit(x_train,y_train)#在这里调用完毕后会生成模型
#5模型评估
#方法一:直接比对真实值和预测值
y_predict = estimator.predict(x_test)#放入测试集,生成预测值
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)#预测值与目标的真正结果进行对比
#方法二:计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:\n",score)
return None
用Knn算法对鸢尾花进行分类,添加网格搜索和交叉验证
def knn_iris_gscv():
#1.获取数据
iris = load_iris()
#2.划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
#特征工程,标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#knn算法预估器
estimator = KNeighborsClassifier()
#加入网格搜索和交叉验证,参数准备.cv表示交叉验证的次数,即将训练集分为10份。
#网格搜索是用来确定列表中的K值,哪一个最好
param_dict = {"n_neighbors":[1,3,4,6,7,9]}
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=10)
estimator.fit(x_train,y_train)
#模型评估
#方法一:直接比对真实值和预测值
y_predict = estimator.predict(x_test)#放入测试集,生成预测值
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)
#方法二:计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:\n",score)
#最佳参数:best_params_
print("最佳参数:\n",estimator.best_params_)
#最佳结果:best_score_
print("最佳结果:\n",estimator.best_score_)
#最佳估计器:best_estimator
print("最佳估计器:\n",estimator.best_estimator_)
#交叉验证结果:cv_results_
print("交叉验证结果:\n",estimator.cv_results_)