6.2 K邻近回归算法(KNeighbors Regressor)
类
class sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs)
参数
参数 |
解释 |
n_neighbors |
int, optional (默认= 5),默认情况下用于kneighbors查询的邻居数。 |
algorithm |
: {'auto','ball_tree','kd_tree','brute'}, optional。用于计算最近邻居的算法: •'ball_tree' 用于BallTree •'kd_tree'用于KDTree •'brute'用于强力搜查. •'auto'将尝试根据传递给fit方法的值来决定最合适的算法 注意:使用强力拟合稀疏输入将覆盖此参数的设置。 |
属性
属性 |
解释 |
effective_metric_ |
str or callable要使用的距离度量。如果度量参数设置为'minkowski',p参数设置为2,则它将与度量参数或其同义词相同,例如'euclidean'。度量函数的其他关键字参数。 |
effective_metric_params_ |
dict对于大多数度量,都将与metric_params参数相同,但如果metric_params属性设置为'minkowski',则也可能包含p参数值。 |
n_samples_fit_ |
int拟合数据中的样本数 |
方法
方法 |
解释 |
fit(X, y) |
从训练数据集中拟合k近邻回归。 |
get_params([deep]) |
获取此估计器的参数。 |
kneighbors([X, n_neighbors, return_distance]) |
找到点的K邻域。 |
kneighbors_graph([X, n_neighbors, mode]) |
计算X上点的k邻域(加权)图 |
predict(X) |
根据提供的数据预测目标 |
score(X, y[, sample_weight]) |
返回预测的确定系数R2。 |
set_params(**params) |
设置此估计器的参数。 |
6.2.1 K邻近算法分析无噪音make_regression数据集
def KNeighborsRegressor_for_make_regression(): myutil = util() X,y = make_regression(n_samples=100,n_features=1,n_informative=2,random_state=8) X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = KNeighborsRegressor().fit(X,y) title = "K邻近算法分析make_regression数据集(无噪音)" myutil.draw_line(X[:,0],y,clf,title) myutil.plot_learning_curve(KNeighborsRegressor(),X,y,title) myutil.show_pic(title)
6.2.2 K邻近算法分析有噪音make_regression数据集
def KNeighborsRegressor_for_make_regression_add_noise(): myutil = util() X,y = make_regression(n_samples=100,n_features=1,n_informative=2,noise=50,random_state=8) X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = KNeighborsRegressor().fit(X,y) title = "K邻近算法分析make_regression数据集(有噪音)" myutil.draw_line(X[:,0],y,clf,title) myutil.plot_learning_curve(KNeighborsRegressor(),X,y,title) myutil.show_pic(title)
6.2.2 K邻近算法分析乳腺癌数据集
def KNeighborsRegressor_for_for_diabetes(): myutil = util() X,y = datasets.load_diabetes().data,datasets.load_diabetes().target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = KNeighborsRegressor().fit(X_train,y_train) title = " K邻近回归算法分析糖尿病数据数据" myutil.print_scores(clf,X_train,y_train,X_test,y_test,title) myutil.plot_learning_curve(KNeighborsRegressor(),X,y,title) myutil.show_pic(title)
输出:
K邻近回归算法分析糖尿病数据: 60.66% K邻近回归算法分析糖尿病数据: 38.87%
看来,用这个方法分析糖尿病数据是非常差的。
6.2.4 K邻近算法分析波士顿房价数据集
def KNeighborsRegressor_for_for_boston(): myutil = util() X,y = datasets.load_boston().data,datasets.load_boston().target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = KNeighborsRegressor().fit(X_train,y_train) title = " K邻近回归算法分析波士顿房价数据" myutil.print_scores(clf,X_train,y_train,X_test,y_test,title) myutil.plot_learning_curve(KNeighborsRegressor(),X,y,title) myutil.show_pic(title)
输出
K邻近回归算法分析波士顿房价数据: 71.71% K邻近回归算法分析波士顿房价数据: 45.91%
看来,用这个方法分析波士顿房价数据是也非常差的
7 朴素贝叶斯
7.1 概念
天气预报有雨P(A):50%、堵车概率P(B): 80%、下雨后堵车概率P(A|B): 40%;那么堵车后下雨的概率P(B|A)是多少,根据朴素贝叶斯定律:
P(A|B) = P(A) · P(B|A) / P(B)
其中:P (A)> P(A|B)、 P (B)> P(B|A)
P(B|A)= P(B) · P(A|B) / P(A)=50%·40%/80%=25%
看看我们如何用Python来实现朴素贝叶斯定律
7.2 用Python程序来实现
一周 [1,0,0,1,0,1,0]下情况,1表示下雨,0表示不下雨。[1,0,0,1,0,1,0]表示周1、4、6下雨,周2、3、5、日不下雨。下面我们改进下。
[1,1,0,1],表示一天内的数据,第1个数据表示是否刮风:1刮,0不刮;第2个数据表示是否闷热:1闷,0不闷;第3个数据表示是否多云:1多云,0不是多云表示和第4个数据表示预报有雨:1预报有雨,0预报没雨。所以[1,1,0,1]表示刮风、闷热、不是多云且预报有雨。[[1,1,0,1],[0,1,1,0],[1,0,0,1],[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,1,0]]这个是一周内的实际数据,我们用X来表示。
X=[[1,1,0,1],[0,1,1,0],[1,0,0,1],[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,1,0]]
用y值表示实际是否下雨了
y=[1,1,0,0,1,0,1]
def my_BernoulliNB(): X = np.array([[1,1,0,1],[0,1,1,0],[1,0,0,1],[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,1,0]]) y = np.array([1,1,0,0,1,0,1]) counts={} for label in np.unique(y): counts[label] = X[y==label].sum(axis=0) print("特性统计:\n{}".format(counts))
输出:
特性统计: {0: array([1, 2, 0, 1]), 1: array([2, 2, 3, 1])}
说明
实际没雨的日子:1天刮风,2天闷热,0天多云,1天预报有雨
实际下雨的日子:2天刮风,2天闷热,3天多云,1天预报有雨
clf = BernoulliNB() clf.fit(X,y) #明天多云 Next_Day = [[0,0,1,0]] pre1 = clf.predict(Next_Day) print(pre1) #另一天刮风、闷热、预报有雨 Another_Day = [[1,1,0,1]] pre2 = clf.predict(Another_Day) print(pre2) print(clf.predict_proba(Next_Day)) print(clf.predict_proba(Another_Day))
输出
[1] [0] [[0.16275954 0.83724046]] [[0.67464862 0.32535138]]
说明
第一天有雨 没雨概率16%,有雨概率84%
第二条没有雨 没雨概率67%,有雨概率32%