পাইথন এবং নম্পি ব্যবহার করে আমি কীভাবে আর-স্কোয়ার গণনা করব?


92

আমি পাইথন এবং নম্পি ব্যবহার করছি স্বেচ্ছাসেবী ডিগ্রির সেরা ফিটের বহুবর্ষ গণনা করতে। আমি x মানগুলির একটি তালিকা, y মান, এবং আমি যে বহুত্ববৃত্তের সাথে ফিট করতে চাই তার ডিগ্রি পাস করি (রৈখিক, চতুর্ভুজ ইত্যাদি)।

এটি অনেক কাজ করে তবে আমি আর (পারস্পরিক সম্পর্কের সহগ) এবং আর-স্কোয়ার (সংকল্পের সহগ) গণনা করতে চাই। আমি আমার ফলাফলগুলিকে এক্সেলের সেরা-ফিট ট্রেন্ডলাইন সক্ষমতার সাথে তুলনা করছি এবং এটির জন্য যে r-স্কোয়ার্ড মান গণনা করা হয়। এটি ব্যবহার করে, আমি জানি যে আমি লিনিয়ার সেরা-ফিটের জন্য সঠিকভাবে আর-স্কোয়ার গণনা করছি (ডিগ্রি সমান 1)। তবে, আমার ফাংশন 1 এর বেশি ডিগ্রি সহ বহুবর্ষের জন্য কাজ করে না।

এক্সেল এটি করতে সক্ষম। আমি নম্পি ব্যবহার করে উচ্চতর অর্ডার বহুত্বের জন্য কীভাবে আর-স্কোয়ার গণনা করব?

এখানে আমার ফাংশন:

import numpy

# Polynomial Regression
def polyfit(x, y, degree):
    results = {}

    coeffs = numpy.polyfit(x, y, degree)
     # Polynomial Coefficients
    results['polynomial'] = coeffs.tolist()

    correlation = numpy.corrcoef(x, y)[0,1]

     # r
    results['correlation'] = correlation
     # r-squared
    results['determination'] = correlation**2

    return results

4
দ্রষ্টব্য: আপনি কেবল কোফের গণনায় ডিগ্রি ব্যবহার করেন।
নিক ডানডৌলাকিস

টিডোক সঠিক। আপনি x এবং y এর পারস্পরিক সম্পর্ক গণনা করছেন এবং y = p_0 + p_1 * x এর জন্য আর-স্কোয়ার। কাজ করা উচিত এমন কিছু কোডের জন্য নীচে আমার উত্তরটি দেখুন। আপনি যদি আমাকে জিজ্ঞাসা করতে আপত্তি না করেন তবে আপনার চূড়ান্ত লক্ষ্য কী? আপনি কি মডেল নির্বাচন করছেন (কোন ডিগ্রিটি ব্যবহার করবেন তা চয়ন করছেন)? অথবা অন্য কিছু?
লাইফ

@ লিফ - অনুরোধটি "এক্সেলের মতো করে" করার জন্য উত্সাহিত হয়। আমি এই উত্তরগুলি থেকে অনুভূতি পাচ্ছি যে কোনও লিনিয়ার-বেস্ট-ফিট বক্ররেখা ব্যবহার করার সময় ব্যবহারকারীরা আর-স্কোয়ার মানটিতে খুব বেশি পড়তে পারে। তবুও, আমি গণিতের উইজার্ড নই এবং এটি অনুরোধ করা কার্যকারিতা।
ট্র্যাভিস বিলে

উত্তর:


62

নাম্পি.পলিফিট ডকুমেন্টেশন থেকে এটি লিনিয়ার রিগ্রেশন উপযুক্ত। বিশেষত, ডিপি 'ডি' সহ নম্পি.পলিফিটটি গড় ফাংশনের সাথে একটি লিনিয়ার রিগ্রেশন ফিট করে

E (y | x) = p_d * x ** d + p_ {d-1} * x ** (d-1) + ... + p_1 * x + p_0

সুতরাং আপনাকে কেবল সেই ফিটের জন্য আর-স্কোয়ার গণনা করতে হবে। লিনিয়ার রিগ্রেশন- এর উইকিপিডিয়া পৃষ্ঠা সম্পূর্ণ বিবরণ দেয়। আপনি আর ^ 2 এর প্রতি আগ্রহী যা আপনি কয়েকটি উপায়ে গণনা করতে পারেন, সম্ভবত সবচেয়ে সহজ এটি

SST = Sum(i=1..n) (y_i - y_bar)^2
SSReg = Sum(i=1..n) (y_ihat - y_bar)^2
Rsquared = SSReg/SST

যেখানে আমি y এর বারের জন্য 'y_bar' ব্যবহার করি এবং প্রতিটি পয়েন্টের উপযুক্ত মান হিসাবে 'y_ihat' ব্যবহার করি।

আমি নিম্পের সাথে ভয়াবহভাবে পরিচিত নই (আমি সাধারণত আরে কাজ করি), সুতরাং আপনার আর-স্কোয়ার গণনা করার জন্য সম্ভবত একটি উত্তম উপায় আছে তবে নিম্নলিখিতটি সঠিক হওয়া উচিত

import numpy

# Polynomial Regression
def polyfit(x, y, degree):
    results = {}

    coeffs = numpy.polyfit(x, y, degree)

     # Polynomial Coefficients
    results['polynomial'] = coeffs.tolist()

    # r-squared
    p = numpy.poly1d(coeffs)
    # fit values, and mean
    yhat = p(x)                         # or [p(z) for z in x]
    ybar = numpy.sum(y)/len(y)          # or sum(y)/len(y)
    ssreg = numpy.sum((yhat-ybar)**2)   # or sum([ (yihat - ybar)**2 for yihat in yhat])
    sstot = numpy.sum((y - ybar)**2)    # or sum([ (yi - ybar)**2 for yi in y])
    results['determination'] = ssreg / sstot

    return results

4
আমি কেবল এটিই উল্লেখ করতে চাই যে তালিকা অনুধাবনের পরিবর্তে নাম্বার অ্যারে ফাংশনগুলি ব্যবহার করা আরও দ্রুত হবে, উদাহরণস্বরূপ numpy.sum ((yi - ybar) ** 2) এবং পড়া সহজ
জোসেফ

17
থেকে উইকি পাতা মতে en.wikipedia.org/wiki/Coefficient_of_determination , আর ^ 2 অধিকাংশ সাধারণ সংজ্ঞা নেই R^2 = 1 - SS_err/SS_totসঙ্গে, R^2 = SS_reg/SS_totশুধু একটি বিশেষ ক্ষেত্রে হচ্ছে।
LWZ

137

খুব দেরিতে জবাব, তবে কারও পক্ষে এর জন্য প্রস্তুত ফাংশন প্রয়োজন:

scipy.stats.linregress

অর্থাত্

slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)

@ অ্যাডাম মার্পলস এর উত্তর হিসাবে।


পারস্পরিক সম্পর্কের সহগের সাথে বিশ্লেষণ করা এবং তারপরে আরও বড় কাজ করা, রিগ্রেশন যুক্তিসঙ্গত ।
嘉 道

19
এই উত্তরটি কেবল রৈখিক প্রতিরোধের জন্য কাজ করে, যা সবচেয়ে সাধারণ বহুপদী
আধিপত্য

9
সাবধানতা: r_value এখানে একটি পিয়ারসনের পারস্পরিক সম্পর্ক সহগ, আর-স্কোয়ার নয়। r_squared = r_value ** 2
ভ্লাদিমির লুকিন

52

ইয়ানল থেকে (এখনও-অন্য-গ্রন্থাগার) sklearn.metricsএকটি r2_scoreফাংশন রয়েছে;

from sklearn.metrics import r2_score

coefficient_of_dermination = r2_score(y, p(x))

4
(সাবধান: "ডিফল্ট মান 'ভেরিয়েন্সইয়েটাইটেড' এর সাথে মিলে যায়, এই আচরণটি 0.17 সংস্করণ থেকে অবচিত করা হয়েছে এবং 0.19 থেকে শুরু করে 'ইউনিফর্ম_ভেরেজ'-এ পরিবর্তিত হবে")
ফ্রাঙ্ক ডারননকোর্ট

4
স্কলারনে r2_score নেতিবাচক মান হতে পারে, এটি সাধারণ ক্ষেত্রে নয়।
কিনকিং লিউ

4
r2_score([1,2,3],[4,5,7])= কেন -16?
সিজেড

22

আমি এটি সফলভাবে ব্যবহার করছি, যেখানে এক্স এবং y অ্যারের মতো-

def rsquared(x, y):
    """ Return R^2 where x and y are array-like."""

    slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
    return r_value**2

20

আমি মূলত নীচের numpy.corrcoefমানদণ্ডগুলি সুপারিশের উদ্দেশ্যে পোস্ট করেছি, মূর্খতার সাথে বুঝতে পারি না যে আসল প্রশ্নটি ইতিমধ্যে ব্যবহার করে corrcoefএবং বাস্তবে উচ্চতর অর্ডার বহুবর্ষীয় ফিটগুলির বিষয়ে জিজ্ঞাসা করছে। আমি স্ট্যাটাসমডেলগুলি ব্যবহার করে বহুবর্ষীয় r-স্কোয়ার্ড প্রশ্নের একটি প্রকৃত সমাধান যুক্ত করেছি এবং আমি মূল মাপদণ্ড রেখে গেছি, যা অফ-টপিকের কারণে, কারও পক্ষে সম্ভাব্য উপকারী।


statsmodelsr^2পলিনোমিয়াল ফিটের গণনা করার ক্ষমতা রয়েছে সরাসরি, এখানে 2 টি পদ্ধতি ...

import statsmodels.api as sm
import statsmodels.formula.api as smf

# Construct the columns for the different powers of x
def get_r2_statsmodels(x, y, k=1):
    xpoly = np.column_stack([x**i for i in range(k+1)])    
    return sm.OLS(y, xpoly).fit().rsquared

# Use the formula API and construct a formula describing the polynomial
def get_r2_statsmodels_formula(x, y, k=1):
    formula = 'y ~ 1 + ' + ' + '.join('I(x**{})'.format(i) for i in range(1, k+1))
    data = {'x': x, 'y': y}
    return smf.ols(formula, data).fit().rsquared # or rsquared_adj

আরও সুবিধা গ্রহণ করার জন্য statsmodels, লাগানো মডেলের সংক্ষিপ্তসারটিও দেখতে হবে, যা জুপিটার / আইপিথন নোটবুকে একটি সমৃদ্ধ HTML টেবিল হিসাবে মুদ্রিত বা প্রদর্শিত হতে পারে। ফলাফলের বস্তুটি ছাড়াও অনেকগুলি দরকারী পরিসংখ্যানের মেট্রিকগুলিতে অ্যাক্সেস সরবরাহ করে rsquared

model = sm.OLS(y, xpoly)
results = model.fit()
results.summary()

নীচে আমার মূল উত্তরটি দেওয়া হয়েছে যেখানে আমি বিভিন্ন লিনিয়ার রিগ্রেশন r ^ 2 পদ্ধতির বেঞ্চমার্ক করেছি ...

Corrcoef প্রশ্ন ব্যবহৃত ফাংশন গণনা পারস্পরিক সম্পর্কের সহগের, rমাত্র একটি একক রৈখিক রিগ্রেশনের জন্য, তাই এটি প্রশ্নে ধরে নি r^2উচ্চতর ক্রম বহুপদী বেশি মানানসই। যাইহোক, এটির মূল্য কিসের জন্য, আমি এটি সন্ধান করতে এসেছি যে লিনিয়ার রিগ্রেশন এর জন্য এটি গণনার সবচেয়ে দ্রুত এবং সর্বাধিক প্রত্যক্ষ পদ্ধতি r

def get_r2_numpy_corrcoef(x, y):
    return np.corrcoef(x, y)[0, 1]**2

এগুলি 1000 এলোমেলো (x, y) পয়েন্টের জন্য একগুচ্ছ পদ্ধতির তুলনায় আমার সময়সীমার ফলাফল ছিল:

  • খাঁটি পাইথন (সরাসরি rগণনা)
    • 1000 লুপ, প্রতি লুপে 3: 1.59 এমএসের মধ্যে সেরা
  • নম্পি পলিটফিট (এন-ডিগ্রি ডিগ্রি পলিনোমিয়াল ফিটগুলির জন্য প্রযোজ্য)
    • 1000 লুপ, 3 লুপ প্রতি: 326 µ এস সেরা of
  • নম্পি ম্যানুয়াল (সরাসরি rগণনা)
    • 10000 লুপ, 3 লুপের জন্য 62.1 µ সেরা op
  • নোমকি কর্কোফ (সরাসরি rগণনা)
    • 10000 লুপ, 3 লুপ প্রতি: 56.6 µ এস সেরা
  • স্কিপি ( rআউটপুট হিসাবে লিনিয়ার রিগ্রেশন )
    • 1000 লুপগুলি, প্রতি লুপে 3: 676 µ এস সেরা
  • স্ট্যাটাসমডেলস (এন-ডিগ্রি ডিগ্রি পলিনোমিয়াল এবং অন্যান্য অনেকগুলি ফিট করতে পারে)
    • 1000 লুপগুলি, প্রতি লুপে 3: 422 of এর মধ্যে সেরা

কর্কোয়েফ পদ্ধতিটি সঙ্কুচিতভাবে r ^ 2 "ম্যানুয়ালি" নকল পদ্ধতি ব্যবহার করে গণনা করে। এটি পলিটফিট পদ্ধতির চেয়ে 5X দ্রুত এবং স্কিপি.লিনগ্র্রেসের চেয়ে 12X ডলার দ্রুত। নম্পি আপনার জন্য কী করছে তা কেবল আরও জোরদার করতে, খাঁটি অজগর থেকে এটি 28 এক্স দ্রুত। আমি নাম্বা এবং পাইপির মতো জিনিসগুলিতে পারদর্শী নই, সুতরাং অন্য কারও কাছে সেই শূন্যস্থান পূরণ করতে হবে, তবে আমি মনে করি এটি আমার পক্ষে যথেষ্ট পরিমাণে বিশ্বাসযোগ্য যা সাধারণ লিনিয়ার রিগ্রেশন corrcoefগণনার rজন্য সেরা সরঞ্জাম ।

আমার বেনমার্কিং কোডটি এখানে। আমি একটি বৃহত্তর নোটবুক থেকে কপি-পেস্ট করেছি (এটিকে আইপিথন নোটবুক না বলা শক্ত ...), তাই পথে যদি কিছু ভেঙে যায় তবে আমি ক্ষমাপ্রার্থী। % টাইমিট ম্যাজিক কমান্ডের আইপিথন প্রয়োজন।

import numpy as np
from scipy import stats
import statsmodels.api as sm
import math

n=1000
x = np.random.rand(1000)*10
x.sort()
y = 10 * x + (5+np.random.randn(1000)*10-5)

x_list = list(x)
y_list = list(y)

def get_r2_numpy(x, y):
    slope, intercept = np.polyfit(x, y, 1)
    r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
    return r_squared
    
def get_r2_scipy(x, y):
    _, _, r_value, _, _ = stats.linregress(x, y)
    return r_value**2
    
def get_r2_statsmodels(x, y):
    return sm.OLS(y, sm.add_constant(x)).fit().rsquared
    
def get_r2_python(x_list, y_list):
    n = len(x_list)
    x_bar = sum(x_list)/n
    y_bar = sum(y_list)/n
    x_std = math.sqrt(sum([(xi-x_bar)**2 for xi in x_list])/(n-1))
    y_std = math.sqrt(sum([(yi-y_bar)**2 for yi in y_list])/(n-1))
    zx = [(xi-x_bar)/x_std for xi in x_list]
    zy = [(yi-y_bar)/y_std for yi in y_list]
    r = sum(zxi*zyi for zxi, zyi in zip(zx, zy))/(n-1)
    return r**2
    
def get_r2_numpy_manual(x, y):
    zx = (x-np.mean(x))/np.std(x, ddof=1)
    zy = (y-np.mean(y))/np.std(y, ddof=1)
    r = np.sum(zx*zy)/(len(x)-1)
    return r**2
    
def get_r2_numpy_corrcoef(x, y):
    return np.corrcoef(x, y)[0, 1]**2
    
print('Python')
%timeit get_r2_python(x_list, y_list)
print('Numpy polyfit')
%timeit get_r2_numpy(x, y)
print('Numpy Manual')
%timeit get_r2_numpy_manual(x, y)
print('Numpy corrcoef')
%timeit get_r2_numpy_corrcoef(x, y)
print('Scipy')
%timeit get_r2_scipy(x, y)
print('Statsmodels')
%timeit get_r2_statsmodels(x, y)

4
আপনি একটি opeালু ফিট না করে 3 টি পদ্ধতির সাথে ঝাল এবং রিগ্রেশনকে ফিট করার সাথে 3 টি পদ্ধতির তুলনা করছেন।
জোসেফ

হ্যাঁ, আমি এটি অনেক কিছুই জানতাম ... তবে এখন আসল প্রশ্নটি না পড়ার জন্য এবং এটি ইতিমধ্যে কর্কোফ ব্যবহার করেছে এবং উচ্চতর অর্ডার পলিনোমিয়ালের জন্য বিশেষত r ^ 2 কে সম্বোধন করছে বলে আমি নির্বোধ বোধ করছি ... এখন আমার বেনমার্কগুলি পোস্ট করার জন্য আমি নির্বোধ বোধ করছি যা একটি ভিন্ন উদ্দেশ্যে ছিল। ওহো ...
ফ্লুটেফ্রেইক

4
আমি ব্যবহার করে মূল প্রশ্নের সমাধানের সাথে আমার উত্তর আপডেট করেছি statsmodelsএবং লিনিয়ার রিগ্রেশন আর -2 পদ্ধতিগুলির অপ্রয়োজনীয় বেঞ্চমার্কিংয়ের জন্য ক্ষমা চেয়েছি, যা আমি আকর্ষণীয়, তবুও অফ-টপিক তথ্য হিসাবে রেখেছি।
flutefreak7

আমি এখনও বেঞ্চমার্কটিকে আকর্ষণীয় বলে মনে করি কারণ আমি আশা করি না যে স্কিপির লাইনরেস স্ট্যাটাসমডেলগুলি আরও জেনেরিক কাজ করে তার চেয়ে ধীর হবে।
জোসেফ

4
দ্রষ্টব্য, np.column_stack([x**i for i in range(k+1)])কপির সাথে x[:,None]**np.arange(k+1)বিপরীত ক্রমযুক্ত নিম্পির ভান্ডার ফাংশনগুলির সাথে বা ব্যবহার করে নিম্পায় ভেক্টরাইজ করা যেতে পারে ।
জোসেফ

5

আর-স্কোয়ার্ড একটি পরিসংখ্যান যা কেবল রৈখিক প্রতিরোধের ক্ষেত্রে প্রযোজ্য।

মূলত, এটি পরিমাপ করে যে আপনার ডেটাতে কত প্রকারের বৈচিত্র লিনিয়ার রিগ্রেশন দ্বারা ব্যাখ্যা করা যেতে পারে।

সুতরাং, আপনি "স্কোয়ার্সের মোট সমষ্টি" গণনা করুন, যা তাদের ফলাফল থেকে প্রতিটি ফলাফলের ভেরিয়েবলের মোট স্কোয়ার বিচ্যুতি। । ।

\ যোগ_ {i} (y_ {i} - y_bar) ^ 2

যেখানে y_bar হ'ল এর মাঝারি।

তারপরে, আপনি "স্কোয়ারগুলির রিগ্রেশন যোগফল" গণনা করুন, এটিই আপনার ফিটড মানগুলি গড় থেকে কতটা পৃথক

\ যোগ_ {i} (yHat_ {i} - y_bar) ^ 2

এবং এই দুটি অনুপাত খুঁজে।

এখন, একটি বহুবর্ষীয় ফিটের জন্য আপনাকে যা করতে হবে তা হ'ল মডেলটির y_hat এর মধ্যে প্লাগ ইন, তবে এইটিকে আর-স্কোয়ার বলা ঠিক হবে না।

আমি এখানে একটি লিঙ্ক পেয়েছি যা এটির সাথে একটু কথা বলে।


এটাই আমার সমস্যার মূল বলে মনে হচ্ছে। বহিরাগত ফিটের তুলনায় একটি লিনিয়ার রিগ্রেশন এর জন্য এক্সেল কীভাবে আলাদা আলাদা স্কোয়ার্ড মান পেতে পারে?
ট্র্যাভিস বিলে

4
আপনি কি একটি লিনিয়ার রিগ্রেশন থেকে কেবল এক্সেল ফিট দিচ্ছেন, এবং একটি বহুবর্ষীয় মডেল থেকে ফিট? এটি ডেটা দুটি অ্যারে থেকে আরএসকিউ গণনা করতে চলেছে, এবং কেবল ধরে নিন যে আপনি এটি একটি রৈখিক মডেল থেকে ফিট দিচ্ছেন। আপনি কী এক্সেল দিচ্ছেন? এক্সেলে 'সেরা ফিট ট্রেন্ডলাইন' কমান্ডটি কী?
বাল্টিমার্ক

এটি এক্সেলের গ্রাফিং ফাংশনগুলির একটি অংশ। আপনি কিছু ডেটা প্লট করতে পারেন, এটিতে ডান ক্লিক করুন, তারপরে বিভিন্ন ধরণের ট্রেন্ড লাইন থেকে চয়ন করুন। লাইনের সমীকরণ পাশাপাশি প্রতিটি ধরণের জন্য একটি r-স্কোয়ার্ড মান দেখার বিকল্প রয়েছে। আর-স্কোয়ার মানটি প্রতিটি ধরণের জন্য পৃথক।
ট্র্যাভিস বিলে

@ ট্র্যাভিস বিলে - আপনি চেষ্টা করেছেন প্রতিটি ভিন্ন গড় ফাংশনটির জন্য একটি আলাদা আর-স্কোয়ার পেতে চলেছেন (যদি না দুটি মডেল নেস্টেড হয় এবং বৃহত্তর মডেলটিতে অতিরিক্ত কোফেকিয়েন্টস সমস্ত 0 হয়ে থাকে)। অবশ্যই এক্সেল একটি ভিন্ন আর স্কোয়ার্ড মান দেয়। @ বাল্টিমার্ক - এটি লিনিয়ার রিগ্রেশন তাই এটি আর-স্কোয়ারড।
লিফ

5

আর-স্কোয়ার্ডে উইকিপিডিয়া নিবন্ধটি পরামর্শ দেয় যে এটি কেবল লিনিয়ার রিগ্রেশন না দিয়ে সাধারণ মডেল ফিটিংয়ের জন্য ব্যবহার করা যেতে পারে।


4
অ-রৈখিক রিগ্রেশন জন্য আর 2 এর সাথে ইস্যুটির একটি ভাল বর্ণনা এখানে দেওয়া হয়েছে: blog.minitab.com/blog/adventures-in-statistics/…
টিকন

5

পাইথন এবং নম্পির সাথে ভারিত আর-স্কোয়ার গণনা করার জন্য এখানে একটি ফাংশন রয়েছে (বেশিরভাগ কোডটি স্কলার্ন থেকে আসে):

from __future__ import division 
import numpy as np

def compute_r2_weighted(y_true, y_pred, weight):
    sse = (weight * (y_true - y_pred) ** 2).sum(axis=0, dtype=np.float64)
    tse = (weight * (y_true - np.average(
        y_true, axis=0, weights=weight)) ** 2).sum(axis=0, dtype=np.float64)
    r2_score = 1 - (sse / tse)
    return r2_score, sse, tse

উদাহরণ:

from __future__ import print_function, division 
import sklearn.metrics 

def compute_r2_weighted(y_true, y_pred, weight):
    sse = (weight * (y_true - y_pred) ** 2).sum(axis=0, dtype=np.float64)
    tse = (weight * (y_true - np.average(
        y_true, axis=0, weights=weight)) ** 2).sum(axis=0, dtype=np.float64)
    r2_score = 1 - (sse / tse)
    return r2_score, sse, tse    

def compute_r2(y_true, y_predicted):
    sse = sum((y_true - y_predicted)**2)
    tse = (len(y_true) - 1) * np.var(y_true, ddof=1)
    r2_score = 1 - (sse / tse)
    return r2_score, sse, tse

def main():
    '''
    Demonstrate the use of compute_r2_weighted() and checks the results against sklearn
    '''        
    y_true = [3, -0.5, 2, 7]
    y_pred = [2.5, 0.0, 2, 8]
    weight = [1, 5, 1, 2]
    r2_score = sklearn.metrics.r2_score(y_true, y_pred)
    print('r2_score: {0}'.format(r2_score))  
    r2_score,_,_ = compute_r2(np.array(y_true), np.array(y_pred))
    print('r2_score: {0}'.format(r2_score))
    r2_score = sklearn.metrics.r2_score(y_true, y_pred,weight)
    print('r2_score weighted: {0}'.format(r2_score))
    r2_score,_,_ = compute_r2_weighted(np.array(y_true), np.array(y_pred), np.array(weight))
    print('r2_score weighted: {0}'.format(r2_score))

if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

ফলাফল:

r2_score: 0.9486081370449679
r2_score: 0.9486081370449679
r2_score weighted: 0.9573170731707317
r2_score weighted: 0.9573170731707317

এটি সূত্রের সাথে মিলে যায় ( আয়না ):

এখানে চিত্র বর্ণনা লিখুন

f_i এর সাথে ফিট থেকে পূর্বানুমানিত মান, y_ {av the পর্যবেক্ষণ করা ডেটার অর্থ y_i হল পর্যবেক্ষণ করা ডেটা মান। ডাব্লু_আই হ'ল প্রতিটি ডাটা পয়েন্টে সাধারণত ওজন প্রয়োগ করা হয়, সাধারণত ডাব্লু_আই = 1। এসএসই ত্রুটির কারণে স্কোয়ারের যোগফল এবং এসএসটি হ'ল স্কোয়ারের সমষ্টি।


আগ্রহী হলে, কোডটিতে আর: https://gist.github.com/dhimmel/588d64a73fa4fef02c8f ( আয়না )


2

Y এবং y_ যেগুলি পান্ডাস সিরিজ বলে ধরে নেওয়া হচ্ছে আসল এবং পূর্বাভাসিত মানগুলি থেকে আর comp 2 গণনা করার জন্য এখানে একটি অজগর ফাংশন রয়েছে:

def r_squared(y, y_hat):
    y_bar = y.mean()
    ss_tot = ((y-y_bar)**2).sum()
    ss_res = ((y-y_hat)**2).sum()
    return 1 - (ss_res/ss_tot)

0

Scipy.stats.linregress উত্স থেকে। তারা স্কোয়ার পদ্ধতির গড় যোগফল ব্যবহার করে।

import numpy as np

x = np.array(x)
y = np.array(y)

# average sum of squares:
ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat

r_num = ssxym
r_den = np.sqrt(ssxm * ssym)
r = r_num / r_den

if r_den == 0.0:
    r = 0.0
else:
    r = r_num / r_den

    if r > 1.0:
        r = 1.0
    elif r < -1.0:
        r = -1.0

0

আপনি সরাসরি এই কোডটি কার্যকর করতে পারেন, এটি আপনাকে বহুপদী খুঁজে পাবে এবং আপনাকে আরও ব্যাখ্যা প্রয়োজন হলে নীচে একটি মন্তব্য রাখতে পারেন এমন আর-মান পাবেন।

from scipy.stats import linregress
import numpy as np

x = np.array([1,2,3,4,5,6])
y = np.array([2,3,5,6,7,8])

p3 = np.polyfit(x,y,3) # 3rd degree polynomial, you can change it to any degree you want
xp = np.linspace(1,6,6)  # 6 means the length of the line
poly_arr = np.polyval(p3,xp)

poly_list = [round(num, 3) for num in list(poly_arr)]
slope, intercept, r_value, p_value, std_err = linregress(x, poly_list)
print(r_value**2)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.