线性回归模型,用来预测
KNN(聚类算法),用来归类(监督学习)
K-Means算法是无监督的聚类算法
ID3(决策树算法),用来决策
朴素贝叶斯,根据关键词对文章内容进行分类
支持向量机(SVM)算法
# encoding=utf8
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits, fetch_20newsgroups, make_blobs
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LinearRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
#回归模型,用来预测
#w1* 附近商业区 w2*附近学校 w3*附近居民数量 = 8千
def price_predict():
#http://scikit-learn.org/stable/modules/linear_model.html
#数据有三个特征:距离地铁距离、附近小学数量、小区绿化率
# P = W1 * A + W2*B + W3 * C
X = np.array([[500.0, 3.0, 0.3], [1000.0, 1.0, 0.6],
[750.0, 2.0, 0.3], [600.0, 5.0, 0.2], [1200.0, 1.0, 0.6]])
#具有三个特征的房屋对应的房价
Y = np.array([10000., 9000., 8000., 12000., 8500.])
#将数据转化到均值是0,方差是1的标准分布内
std_x = StandardScaler()
std_x.fit(X)
x_train = std_x.transform(X)
std_y = StandardScaler()
y_train = std_y.fit_transform(Y.reshape(-1,1))
#构建线性预测模型
lr = LinearRegression()
#模型在历史数据上进行训练,Y.reshape(-1,1)将Y变为二维数组,fit函数要求二维数组
lr.fit(x_train,y_train)
#使用训练模型预测新房屋[1300,3.0,0.4]的价格
x_predict = std_x.transform(np.array([[1300,3.0,0.4]]))
print(std_y.inverse_transform(lr.predict(x_predict)))
# price_predict()
#k近邻分类(k表示以最近的几个邻居作为分类的指标)
#kNN表示了物以类聚人以群居的基本思考方法,最近的k个邻居是什么类别,预测样本就会被化为该类别
def knn_predict_rev(point):
#http://scikit-learn.org/stable/modules/neighbors.html
#数据理解为二维坐标上的6个点
X = np.array([[1.0, 1.0], [1, 1.5], [0.5, 1.5],[3.0, 3.0], [3.0, 3.5], [2.8, 3.1]])
#6个点的类别,按顺序和X依次对应,[1.0,1.0]的类别是0,依次类推
Y = np.array([0,0,0,1,1,1])
#n_neighbors就是kNN中的k
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X,Y)
print(knn.predict(np.array([[2.0,3.0]])))
# knn_predict_rev([[2.0,3.0]])
def decide_play():
#ID3(决策树算法)
"""
#http://scikit-learn.org/stable/modules/tree.html
什么是Gini?
dtree.csv样例数据:
Outlook,Temperatur,Humidity,Windy,PlayGolf
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
......
:return:
"""
df = pd.read_csv('dtree.csv')
#将数据转换为字典格式,orient="record"参数指定数据格式为{column:value}的形式
#第一行数据为{Outlook:'sunny',Temperatur:85,Humidity:85,Windy:False,PlayGolf:no}
#一个字典对应一行数据
dict_train = df.loc[:,['Outlook','Temperatur','Humidity','Windy']].to_dict(orient="record")
#如果pandas从DataFrame取出一列数据,该数据类型会变为Series
dict_target = pd.DataFrame(df['Play'],columns=['Play']).to_dict(orient="record")
#训练数据字典向量化
dv_train = DictVectorizer(sparse=False)
x_train = dv_train.fit_transform(dict_train)
#目标数据字典向量化
dv_target = DictVectorizer(sparse=False)
y_target = dv_target.fit_transform(dict_target)
#创建训练模型并训练
d_tree = DecisionTreeClassifier()
d_tree.fit(x_train,y_target)
data_predict = {'Humidity': 85,
'Outlook': 'sunny',
'Temperatur': 85,
'Windy': False}
x_data = dv_train.transform(data_predict)
print (dv_target.inverse_transform(d_tree.predict(x_data)))
# decide_play()
def article_category():
#http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes
"""
使用朴素贝叶斯,根据关键词对文章内容进行分类
20newsgroups中的数据形式:
['文章1','文章2',........,'文章n']
整体是一个数组,文章n代表一段文字
:return:
"""
#加载20newsgroups数据源,里面是主要英文报刊杂志的文章整理
#categories指明要加载的文章类别,subset指明要加载训练集
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
twenty_train = fetch_20newsgroups(subset='train',categories=categories) #
#计算所有文章的TFIDF
tfidf_transformer = TfidfVectorizer()
X_train_tfidf = tfidf_transformer.fit_transform(twenty_train.data)
#构建多项式朴素贝叶斯模型
clf = MultinomialNB(alpha=1.0).fit(X_train_tfidf, twenty_train.target)
#需要判断类别的文章
docs_new = ['Chemical reaction', 'Intel CPU is good','There is no god','Moses go across the sea']
#将要判断的文章向量花
X_new_tfidf = tfidf_transformer.transform(docs_new)
#进行预测
predicted = clf.predict(X_new_tfidf)
#zip 将数组a[1,2,3] b['a','b','c']变为[(1,'a'),(2,'b'),(3,'c')]
for doc, category in zip(docs_new, predicted):
print('%r => %s' % (doc, twenty_train.target_names[category]))
# article_category()
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt
#支持向量机(SVM):找到分类界面,使支持向量间的间隔最大,支持向量到分割界面的距离最小
#支持向量是通过到分割界面距离最小的点的向量,且两向量间的距离最大
def hw_recognition():
#http://scikit-learn.org/stable/modules/svm.html
digits = load_digits()
#random_state 设置随机种子
X_train, X_test, Y_train, Y_test = train_test_split(digits.data, digits.target,
test_size=0.25, random_state=23)
ss = StandardScaler()
#fit是实例方法,必须由实例调用
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
lsvc = LinearSVC()
lsvc.fit(X_train, Y_train)
#Y_predict = lsvc.predict(np.array([digits.data[220]]))
#plt.imshow(digits.images[220])
#print Y_predict
#plt.show()
Y_predict = lsvc.predict(X_test)
#生成评估报告:
#precision(精确率) = 正正/(正正+反正)
#recall(召回率,覆盖率) = 正正/(正正+正反)
#按照行解释正反: 正正:真正的正例预测为正例,正反:真正的正例预测为反例,反正:真正的反例预测为正例,
#反反:真正的反例预测为反例
print (classification_report(Y_test, Y_predict, target_names=digits.target_names.astype(str)))
# hw_recognition()
def kmeans_plot():
"""
#http://scikit-learn.org/stable/modules/clustering.html
kmeans算法的过程:(假如有两类)
1.随机选择两个点作为聚类的中心
2.计算所有点距离两个中心的距离,选择距离较近的点作为类别。(例如:距离蓝点近,类别是蓝色)
3.计算已经分好类的各组数据的平均值,使用各组数据的平均值中心作为新的中心
4.以新的中心为依据,跳转到第2步
5.直到收敛(两次迭代的数值没有明显的变化:新中心点距离上一次计算中心点的距离小于某个阈值,例如:0.03)
"""
plt.figure(figsize=(6, 3))
n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
plt.subplot(121)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.subplot(122)
plt.scatter(X[:, 0], X[:, 1], c=y)
# kmeans_plot()
"""
A,B表明两个工作地点的收益,A一个小时50$,B一个小时100$
W1,W2是两地工作时间,称为:权重,机器学习中要调整的系数,[W1,W2]构成一个二维搜索空间
T = W1 * A + W2 * B 是我们的评估函数
TMax = 650 是期望目标,也是我们的学习目标
每天工作8小时,每地至少工作一小时,这是学习约束
delta = |T - TMax| 绝对值是我们的评估函数,损失函数(cost,loss)
delta达到什么结果搜索结束,由算法来设计,例如delta=1 搜索结束(搜索结束也称为函数收敛)
在搜索空间中尝试搜索过程中,对W1、W2改变的幅度称为学习率
"""
什么是机器学习?
通过对已知样本构建学习模型,具有对未知样本的分类和预测能力
学习模型的参数的过程称为训练,学习的素材(数据)称为样本
学习的类型:监督学习和非监督学习
监督学习(从历史经验学习)
1.线性回归(regression) 预测趋势和数量,所谓的模型是一次多项式的参数例如(w1 * x1+w2 x * x2+…xn * wn = y,w1,w2,…wn,是模型参数,y是学习的目标)
2.朴素贝叶斯分类(classification) 用来给事物打标签(类别),所谓的模型是某种特征统计的先验次数,例如对职位分类,爬虫类职位相关关键词在训练数据集上:scrapy出现20次,requests出现10次,selenium出现15次。。。。(20,10,15 就是我们训练出的模型)
3.决策树(classification)
4.PCA(主成分分析,降维,dimensionality reduction) 找出特征向量中最重要的特征,丢弃不重要的特征,减少目标数据特征量,使学习复杂性降低
集成学习
1.bagging方法
bagging+决策树 = 随机森林
2.boosting方法
boosting+决策树 = 梯度提升树